Advertisement
Guest User

Untitled

a guest
Jul 29th, 2017
495
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.27 KB | None | 0 0
  1. package ks.javafx.table.refresh;
  2.  
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. import javafx.scene.paint.Color;
  7.  
  8. public class Validator
  9. {
  10. private Map person2col = new HashMap();
  11. private Color[] colors = new Color[] { Color.RED, Color.ORANGE, Color.BLUE, Color.VIOLET, Color.MAGENTA };
  12.  
  13. public Validator()
  14. {
  15. }
  16.  
  17. public void forceValidation(Person person)
  18. {
  19. int length = person.getLastName().length();
  20. Color color = colors[length % colors.length];
  21. person2col.put(person, color);
  22. }
  23.  
  24. public Color getValidation(Person person)
  25. {
  26. return person2col.get(person);
  27. }
  28. }
  29.  
  30. package ks.javafx.table.refresh;
  31.  
  32. import javafx.beans.value.ChangeListener;
  33. import javafx.beans.value.ObservableValue;
  34. import javafx.scene.control.TableCell;
  35. import javafx.scene.control.TextField;
  36. import javafx.scene.paint.Color;
  37. import ks.javafx.util.ColorUtil;
  38.  
  39. public class EditingCell extends TableCell<Person, String>
  40. {
  41. private Validator validator;
  42. private TextField textField;
  43.  
  44. public EditingCell(Validator validator)
  45. {
  46. this.validator = validator;
  47. }
  48.  
  49. @Override
  50. public void startEdit()
  51. {
  52. if(!isEmpty())
  53. {
  54. super.startEdit();
  55. createTextField();
  56. setText(null);
  57. setGraphic(textField);
  58. textField.selectAll();
  59. }
  60. }
  61.  
  62. @Override
  63. public void cancelEdit()
  64. {
  65. super.cancelEdit();
  66.  
  67. setText(getItem());
  68. setGraphic(null);
  69. }
  70.  
  71. @Override
  72. public void updateItem(String item, boolean empty)
  73. {
  74. super.updateItem(item, empty);
  75.  
  76. if(empty)
  77. {
  78. setText(null);
  79. setGraphic(null);
  80. }
  81. else
  82. {
  83. if(isEditing())
  84. {
  85. if(textField != null)
  86. {
  87. textField.setText(getString());
  88. }
  89. setText(null);
  90. setGraphic(textField);
  91. }
  92. else
  93. {
  94. setText(getString());
  95. int index = getIndex();
  96. Person person = getTableView().getItems().get(index);
  97.  
  98. Color color = validator.getValidation(person);
  99. // color = Color.ALICEBLUE;
  100. if(color != null)
  101. {
  102. String webColor = ColorUtil.toWebString(color);
  103. setStyle("-fx-background-color:" + webColor + ";");
  104. }
  105. setGraphic(null);
  106. }
  107. }
  108. }
  109.  
  110. private void createTextField()
  111. {
  112. textField = new TextField(getString());
  113. textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
  114. textField.focusedProperty().addListener(new ChangeListener<Boolean>()
  115. {
  116. @Override
  117. public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2)
  118. {
  119. if(!arg2)
  120. {
  121. commitEdit(textField.getText());
  122. }
  123. }
  124. });
  125. }
  126.  
  127. private String getString()
  128. {
  129. return getItem() == null ? "" : getItem().toString();
  130. }
  131. }
  132.  
  133. package ks.javafx.table.refresh;
  134.  
  135. import javafx.beans.property.SimpleStringProperty;
  136.  
  137. public class Person
  138. {
  139. private final SimpleStringProperty firstName;
  140. private final SimpleStringProperty lastName;
  141. private final SimpleStringProperty email;
  142.  
  143. public Person(String fName, String lName, String email)
  144. {
  145. this.firstName = new SimpleStringProperty(fName);
  146. this.lastName = new SimpleStringProperty(lName);
  147. this.email = new SimpleStringProperty(email);
  148. }
  149.  
  150. public String getFirstName()
  151. {
  152. return firstName.get();
  153. }
  154.  
  155. public void setFirstName(String fName)
  156. {
  157. firstName.set(fName);
  158. }
  159.  
  160. public String getLastName()
  161. {
  162. return lastName.get();
  163. }
  164.  
  165. public void setLastName(String fName)
  166. {
  167. lastName.set(fName);
  168. }
  169.  
  170. public String getEmail()
  171. {
  172. return email.get();
  173. }
  174.  
  175. public void setEmail(String fName)
  176. {
  177. email.set(fName);
  178. }
  179. }
  180.  
  181. package ks.javafx.table.refresh;
  182.  
  183. import javafx.application.Application;
  184. import javafx.collections.FXCollections;
  185. import javafx.collections.ObservableList;
  186. import javafx.event.ActionEvent;
  187. import javafx.event.EventHandler;
  188. import javafx.geometry.Insets;
  189. import javafx.scene.Group;
  190. import javafx.scene.Node;
  191. import javafx.scene.Scene;
  192. import javafx.scene.control.Button;
  193. import javafx.scene.control.Label;
  194. import javafx.scene.control.TableCell;
  195. import javafx.scene.control.TableColumn;
  196. import javafx.scene.control.TableColumn.CellEditEvent;
  197. import javafx.scene.control.TableView;
  198. import javafx.scene.control.TextField;
  199. import javafx.scene.control.cell.PropertyValueFactory;
  200. import javafx.scene.layout.FlowPane;
  201. import javafx.scene.layout.HBox;
  202. import javafx.scene.layout.VBox;
  203. import javafx.scene.text.Font;
  204. import javafx.stage.Stage;
  205. import javafx.util.Callback;
  206.  
  207. public class RefreshTableApp extends Application
  208. {
  209. private Validator validator = new Validator();
  210.  
  211. private TableView<Person> table = new TableView<Person>();
  212. private static final Person PERSON_A = new Person("Anna", "Rogowska", "anna.rogowska@example.com");
  213. private final ObservableList<Person> data = FXCollections.observableArrayList(new Person("Jacob", "Smith",
  214. "jacob.smith@example.com"), new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
  215. new Person("Ethan", "Williams", "ethan.williams@example.com"), new Person("Emma", "Jones",
  216. "emma.jones@example.com"), new Person("Michael", "Brown", "michael.brown@example.com"),
  217. PERSON_A);
  218. final HBox hb = new HBox();
  219.  
  220. public static void main(String[] args)
  221. {
  222. launch(args);
  223. }
  224.  
  225. @Override
  226. public void start(Stage stage)
  227. {
  228. Scene scene = new Scene(new Group());
  229. stage.setTitle("Table View Sample");
  230. stage.setWidth(450);
  231. stage.setHeight(550);
  232.  
  233. final Label label = new Label("Address Book");
  234. label.setFont(new Font("Arial", 20));
  235.  
  236. table.setEditable(true);
  237. Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>()
  238. {
  239. @Override
  240. public TableCell call(TableColumn p)
  241. {
  242. return new EditingCell(validator);
  243. }
  244. };
  245.  
  246. TableColumn firstNameCol = new TableColumn("First Name");
  247. firstNameCol.setMinWidth(100);
  248. firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
  249. firstNameCol.setCellFactory(cellFactory);
  250. firstNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>()
  251. {
  252. @Override
  253. public void handle(CellEditEvent<Person, String> t)
  254. {
  255. t.getTableView().getItems().get(t.getTablePosition().getRow()).setFirstName(t.getNewValue());
  256. }
  257. });
  258.  
  259. TableColumn lastNameCol = new TableColumn("Last Name");
  260. lastNameCol.setMinWidth(100);
  261. lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
  262. lastNameCol.setCellFactory(cellFactory);
  263. lastNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>()
  264. {
  265. @Override
  266. public void handle(CellEditEvent<Person, String> t)
  267. {
  268. t.getTableView().getItems().get(t.getTablePosition().getRow()).setLastName(t.getNewValue());
  269. }
  270. });
  271.  
  272. TableColumn emailCol = new TableColumn("Email");
  273. emailCol.setMinWidth(200);
  274. emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("email"));
  275. emailCol.setCellFactory(cellFactory);
  276. emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>()
  277. {
  278. @Override
  279. public void handle(CellEditEvent<Person, String> t)
  280. {
  281. t.getTableView().getItems().get(t.getTablePosition().getRow()).setEmail(t.getNewValue());
  282. }
  283. });
  284.  
  285. table.setItems(data);
  286. table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
  287.  
  288. final TextField addFirstName = new TextField();
  289. addFirstName.setPromptText("First Name");
  290. addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
  291. final TextField addLastName = new TextField();
  292. addLastName.setMaxWidth(lastNameCol.getPrefWidth());
  293. addLastName.setPromptText("Last Name");
  294. final TextField addEmail = new TextField();
  295. addEmail.setMaxWidth(emailCol.getPrefWidth());
  296. addEmail.setPromptText("Email");
  297.  
  298. final Button addButton = new Button("Add");
  299. addButton.setOnAction(new EventHandler<ActionEvent>()
  300. {
  301. @Override
  302. public void handle(ActionEvent e)
  303. {
  304. data.add(new Person(addFirstName.getText(), addLastName.getText(), addEmail.getText()));
  305. addFirstName.clear();
  306. addLastName.clear();
  307. addEmail.clear();
  308. }
  309. });
  310.  
  311. hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
  312. hb.setSpacing(3);
  313.  
  314. final VBox vbox = new VBox();
  315. vbox.setSpacing(5);
  316. vbox.setPadding(new Insets(10, 0, 0, 10));
  317. vbox.getChildren().addAll(label, table, hb, createButtons());
  318.  
  319. ((Group) scene.getRoot()).getChildren().addAll(vbox);
  320.  
  321. stage.setScene(scene);
  322. stage.show();
  323.  
  324. }
  325.  
  326. private Node createButtons()
  327. {
  328. Button but = new Button("validate last person");
  329. but.setOnAction(e -> {
  330. validator.forceValidation(data.get(data.size() - 1));
  331. });
  332.  
  333.  
  334. FlowPane pane = new FlowPane(but);
  335. return pane;
  336. }
  337.  
  338. }
  339.  
  340. package ks.javafx.util;
  341.  
  342. import javafx.scene.paint.Color;
  343.  
  344. public final class ColorUtil
  345. {
  346. /**
  347. * Translates provided {@link Color} to web string (#RRGGBB).
  348. * @param aColor
  349. * @return
  350. */
  351. public static String toWebString(final Color aColor)
  352. {
  353. final int r = (int) Math.round(aColor.getRed() * 255.0);
  354. final int g = (int) Math.round(aColor.getGreen() * 255.0);
  355. final int b = (int) Math.round(aColor.getBlue() * 255.0);
  356. final String res = String.format("#%02x%02x%02x", r, g, b);
  357. return res;
  358. }
  359.  
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement