Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.35 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. import javafx.application.Application;
  5. import javafx.application.Platform;
  6. import javafx.beans.property.SimpleStringProperty;
  7. import javafx.beans.value.ChangeListener;
  8. import javafx.beans.value.ObservableValue;
  9. import javafx.collections.FXCollections;
  10. import javafx.collections.ObservableList;
  11. import javafx.event.EventHandler;
  12. import javafx.geometry.Insets;
  13. import javafx.scene.Group;
  14. import javafx.scene.Scene;
  15. import javafx.scene.control.ContentDisplay;
  16. import javafx.scene.control.Label;
  17. import javafx.scene.control.TableCell;
  18. import javafx.scene.control.TableColumn;
  19. import javafx.scene.control.TableColumn.CellEditEvent;
  20. import javafx.scene.control.TableView;
  21. import javafx.scene.control.TextField;
  22. import javafx.scene.control.cell.PropertyValueFactory;
  23. import javafx.scene.input.KeyCode;
  24. import javafx.scene.input.KeyEvent;
  25. import javafx.scene.layout.VBox;
  26. import javafx.scene.text.Font;
  27. import javafx.stage.Stage;
  28. import javafx.util.Callback;
  29.  
  30. public class EditableTableViewWithTab extends Application {
  31.  
  32. private TableView<Person> table = new TableView<Person>();
  33. private final ObservableList<Person> data = FXCollections
  34. .observableArrayList(new Person("Jacob", "Smith",
  35. "jacob.smith@example.com"), new Person("Isabella",
  36. "Johnson", "isabella.johnson@example.com"), new Person(
  37. "Ethan", "Williams", "ethan.williams@example.com"),
  38. new Person("Emma", "Jones", "emma.jones@example.com"),
  39. new Person("Michael", "Brown", "michael.brown@example.com"));
  40.  
  41. public static void main(String[] args) {
  42. launch(args);
  43. }
  44.  
  45. @Override
  46. public void start(Stage stage) {
  47. Scene scene = new Scene(new Group());
  48. stage.setTitle("Table View Sample");
  49. stage.setWidth(450);
  50. stage.setHeight(550);
  51.  
  52. final Label label = new Label("Address Book");
  53. label.setFont(new Font("Arial", 20));
  54.  
  55. table.setEditable(true);
  56. Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() {
  57. public TableCell call(TableColumn p) {
  58. return new EditingCell();
  59. }
  60. };
  61.  
  62. TableColumn firstNameCol = new TableColumn("First Name");
  63. firstNameCol.setMinWidth(100);
  64. firstNameCol
  65. .setCellValueFactory(new PropertyValueFactory<Person, String>(
  66. "firstName"));
  67. firstNameCol.setCellFactory(cellFactory);
  68. firstNameCol
  69. .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
  70. @Override
  71. public void handle(CellEditEvent<Person, String> t) {
  72. ((Person) t.getTableView().getItems()
  73. .get(t.getTablePosition().getRow()))
  74. .setFirstName(t.getNewValue());
  75. }
  76. });
  77.  
  78. TableColumn lastNameCol = new TableColumn("Last Name");
  79. lastNameCol.setMinWidth(100);
  80. lastNameCol
  81. .setCellValueFactory(new PropertyValueFactory<Person, String>(
  82. "lastName"));
  83. lastNameCol.setCellFactory(cellFactory);
  84. lastNameCol
  85. .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
  86. @Override
  87. public void handle(CellEditEvent<Person, String> t) {
  88. ((Person) t.getTableView().getItems()
  89. .get(t.getTablePosition().getRow()))
  90. .setLastName(t.getNewValue());
  91. }
  92. });
  93.  
  94. TableColumn emailCol = new TableColumn("Email");
  95. emailCol.setMinWidth(200);
  96. emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
  97. "email"));
  98. emailCol.setCellFactory(cellFactory);
  99. emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
  100. @Override
  101. public void handle(CellEditEvent<Person, String> t) {
  102. ((Person) t.getTableView().getItems()
  103. .get(t.getTablePosition().getRow())).setEmail(t
  104. .getNewValue());
  105. }
  106. });
  107.  
  108. table.setItems(data);
  109. table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
  110.  
  111. final TextField addFirstName = new TextField();
  112. addFirstName.setPromptText("First Name");
  113. addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
  114. final TextField addLastName = new TextField();
  115. addLastName.setMaxWidth(lastNameCol.getPrefWidth());
  116. addLastName.setPromptText("Last Name");
  117. final TextField addEmail = new TextField();
  118. addEmail.setMaxWidth(emailCol.getPrefWidth());
  119. addEmail.setPromptText("Email");
  120.  
  121. final VBox vbox = new VBox();
  122. vbox.setSpacing(5);
  123. vbox.setPadding(new Insets(10, 0, 0, 10));
  124. vbox.getChildren().addAll(label, table);
  125.  
  126. ((Group) scene.getRoot()).getChildren().addAll(vbox);
  127.  
  128. stage.setScene(scene);
  129. stage.show();
  130. }
  131.  
  132. public static class Person {
  133.  
  134. private final SimpleStringProperty firstName;
  135. private final SimpleStringProperty lastName;
  136. private final SimpleStringProperty email;
  137.  
  138. private Person(String fName, String lName, String email) {
  139. this.firstName = new SimpleStringProperty(fName);
  140. this.lastName = new SimpleStringProperty(lName);
  141. this.email = new SimpleStringProperty(email);
  142. }
  143.  
  144. public String getFirstName() {
  145. return firstName.get();
  146. }
  147.  
  148. public void setFirstName(String fName) {
  149. firstName.set(fName);
  150. }
  151.  
  152. public String getLastName() {
  153. return lastName.get();
  154. }
  155.  
  156. public void setLastName(String fName) {
  157. lastName.set(fName);
  158. }
  159.  
  160. public String getEmail() {
  161. return email.get();
  162. }
  163.  
  164. public void setEmail(String fName) {
  165. email.set(fName);
  166. }
  167. }
  168.  
  169. class EditingCell extends TableCell<Person, String> {
  170.  
  171. private TextField textField;
  172.  
  173. public EditingCell() {
  174. }
  175.  
  176. @Override
  177. public void startEdit() {
  178. if (!isEmpty()) {
  179. super.startEdit();
  180. if (textField == null) {
  181. createTextField();
  182. }
  183.  
  184. setGraphic(textField);
  185. setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
  186. // textField.selectAll();
  187. Platform.runLater(new Runnable() {
  188. @Override
  189. public void run() {
  190. textField.requestFocus();
  191. textField.selectAll();
  192. }
  193. });
  194. }
  195. }
  196.  
  197. @Override
  198. public void cancelEdit() {
  199. super.cancelEdit();
  200.  
  201. setText((String) getItem());
  202. setGraphic(null);
  203. }
  204.  
  205. @Override
  206. public void updateItem(String item, boolean empty) {
  207. super.updateItem(item, empty);
  208.  
  209. if (empty) {
  210. setText(null);
  211. setGraphic(null);
  212. } else {
  213. if (isEditing()) {
  214. if (textField != null) {
  215. textField.setText(getString());
  216. }
  217. setGraphic(textField);
  218. setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
  219. } else {
  220. setText(getString());
  221. setContentDisplay(ContentDisplay.TEXT_ONLY);
  222. }
  223. }
  224. }
  225.  
  226. private void createTextField() {
  227. textField = new TextField(getString());
  228. textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()
  229. * 2);
  230.  
  231. textField.focusedProperty().addListener(
  232. new ChangeListener<Boolean>() {
  233. @Override
  234. public void changed(
  235. ObservableValue<? extends Boolean> arg0,
  236. Boolean arg1, Boolean arg2) {
  237. if (!arg2) {
  238. commitEdit(textField.getText());
  239. }
  240. }
  241. });
  242.  
  243. textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
  244. @Override
  245. public void handle(KeyEvent t) {
  246. if (t.getCode() == KeyCode.ENTER) {
  247. commitEdit(textField.getText());
  248. } else if (t.getCode() == KeyCode.ESCAPE) {
  249. cancelEdit();
  250. } else if (t.getCode() == KeyCode.TAB) {
  251. commitEdit(textField.getText());
  252. TableColumn nextColumn = getNextColumn(!t.isShiftDown());
  253. if (nextColumn != null) {
  254. getTableView().edit(getTableRow().getIndex(),
  255. nextColumn);
  256. }
  257.  
  258. }
  259. }
  260.  
  261. });
  262. }
  263.  
  264. private String getString() {
  265. return getItem() == null ? "" : getItem().toString();
  266. }
  267.  
  268. private TableColumn<Person, ?> getNextColumn(boolean forward) {
  269. List<TableColumn<Person, ?>> columns = new ArrayList<>();
  270. for (TableColumn<Person, ?> column : getTableView().getColumns()) {
  271. columns.addAll(getLeaves(column));
  272. }
  273. // There is no other column that supports editing.
  274. if (columns.size() < 2) {
  275. return null;
  276. }
  277. int currentIndex = columns.indexOf(getTableColumn());
  278. int nextIndex = currentIndex;
  279. if (forward) {
  280. nextIndex++;
  281. if (nextIndex > columns.size() - 1) {
  282. nextIndex = 0;
  283. }
  284. } else {
  285. nextIndex--;
  286. if (nextIndex < 0) {
  287. nextIndex = columns.size() - 1;
  288. }
  289. }
  290. return columns.get(nextIndex);
  291. }
  292.  
  293. private List<TableColumn<Person, ?>> getLeaves(
  294. TableColumn<Person, ?> root) {
  295. List<TableColumn<Person, ?>> columns = new ArrayList<>();
  296. if (root.getColumns().isEmpty()) {
  297. // We only want the leaves that are editable.
  298. if (root.isEditable()) {
  299. columns.add(root);
  300. }
  301. return columns;
  302. } else {
  303. for (TableColumn<Person, ?> column : root.getColumns()) {
  304. columns.addAll(getLeaves(column));
  305. }
  306. return columns;
  307. }
  308. }
  309. }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement