Guest User

Untitled

a guest
Sep 22nd, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.66 KB | None | 0 0
  1. import java.time.LocalDate;
  2. import java.util.*;
  3. import java.util.function.Function;
  4. import java.util.function.Predicate;
  5. import java.util.stream.Collectors;
  6. import javafx.application.Application;
  7. import javafx.beans.binding.Bindings;
  8. import javafx.beans.property.*;
  9. import javafx.beans.value.ChangeListener;
  10. import javafx.beans.value.ObservableValue;
  11. import javafx.collections.FXCollections;
  12. import javafx.collections.ListChangeListener;
  13. import javafx.collections.ObservableList;
  14. import javafx.collections.transformation.FilteredList;
  15. import javafx.collections.transformation.SortedList;
  16. import javafx.geometry.Insets;
  17. import javafx.scene.Scene;
  18. import javafx.scene.chart.PieChart;
  19. import javafx.scene.control.*;
  20. import javafx.scene.layout.BorderPane;
  21. import javafx.scene.layout.FlowPane;
  22. import javafx.scene.layout.HBox;
  23. import javafx.stage.Stage;
  24. import org.controlsfx.control.CheckComboBox;
  25.  
  26.  
  27. public class MainApp extends Application {
  28. @Override
  29. public void start(Stage primaryStage) {
  30. TableView<Person> table = new TableView<>();
  31. table.getSelectionModel().setCellSelectionEnabled(true);
  32. table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
  33. table.getColumns().add(column("Name", Person::nameProperty));
  34. table.getColumns().add(column("Email", Person::emailProperty));
  35. table.getColumns().add(column("Gender", Person::genderProperty));
  36. table.getColumns().add(column("Birthday", Person::birthdayProperty));
  37. table.getColumns().add(column("Age", Person::ageProperty));
  38. table.getColumns().add(column("Status", Person::statusProperty));
  39.  
  40. ComboBox<Person.Gender> genderFilterCombo = new ComboBox<>();
  41. genderFilterCombo.getItems().addAll(Person.Gender.values());
  42.  
  43. CheckComboBox<Person.Gender> genderFilterCheckCombo= new CheckComboBox<>();
  44. genderFilterCheckCombo.getItems().addAll(Person.Gender.values());
  45.  
  46. CheckComboBox<Person.Status> statusFilterCheckCombo= new CheckComboBox<>();
  47. statusFilterCheckCombo.getItems().addAll(Person.Status.values());
  48.  
  49. TextField nameFilterField = new TextField();
  50. TextField agefromFilterField = new TextField();
  51. TextField ageuntilFilterField = new TextField();
  52. DatePicker datefromFilterField = new DatePicker();
  53. DatePicker dateuntilFilterField = new DatePicker();
  54.  
  55. Label totalperson = new Label();
  56. Label totalvip = new Label();
  57. Label totaloldperson = new Label();
  58. Label totalyoungperson = new Label();
  59.  
  60. nameFilterField.setPromptText("Name");
  61. agefromFilterField.setPromptText("Age from");
  62. ageuntilFilterField.setPromptText("Age until");
  63. datefromFilterField.setPromptText("Birthday from");
  64. dateuntilFilterField.setPromptText("Birthday until");
  65.  
  66. ObjectProperty<Predicate<Person>> nameFilter = new SimpleObjectProperty<>();
  67. ObjectProperty<Predicate<Person>> genderFilter = new SimpleObjectProperty<>();
  68. ObjectProperty<Predicate<Person>> gender2Filter = new SimpleObjectProperty<>();
  69. ObjectProperty<Predicate<Person>> datefromFilter = new SimpleObjectProperty<>();
  70. ObjectProperty<Predicate<Person>> dateuntilFilter = new SimpleObjectProperty<>();
  71. ObjectProperty<Predicate<Person>> agefromFilter = new SimpleObjectProperty<>();
  72. ObjectProperty<Predicate<Person>> ageuntilFilter = new SimpleObjectProperty<>();
  73. ObjectProperty<Predicate<Person>> statusFilter = new SimpleObjectProperty<>();
  74.  
  75. nameFilter.bind(Bindings.createObjectBinding(() ->
  76. person -> person.getName().toLowerCase().contains(nameFilterField.getText().toLowerCase()),
  77. nameFilterField.textProperty()));
  78.  
  79. genderFilter.bind(Bindings.createObjectBinding(() ->
  80. person -> genderFilterCombo.getValue() == null || genderFilterCombo.getValue() == person.getGender(),
  81. genderFilterCombo.valueProperty()));
  82.  
  83. gender2Filter.bind(Bindings.createObjectBinding(() ->
  84. genderFilterCheckCombo.getCheckModel().getCheckedItems().isEmpty() ? person-> true : person->
  85. genderFilterCheckCombo.getCheckModel().getCheckedItems().contains(person.getGender()),
  86. genderFilterCheckCombo.getCheckModel().getCheckedItems()));
  87.  
  88. datefromFilter.bind(Bindings.createObjectBinding(() ->
  89. person -> datefromFilterField.getValue() == null || datefromFilterField.getValue().isBefore(person.getBirthday())
  90. || datefromFilterField.getValue().isEqual(person.getBirthday()),
  91. datefromFilterField.valueProperty()));
  92.  
  93. dateuntilFilter.bind(Bindings.createObjectBinding(() ->
  94. person -> dateuntilFilterField.getValue() == null || dateuntilFilterField.getValue().isAfter(person.getBirthday())
  95. || dateuntilFilterField.getValue().isEqual(person.getBirthday()),
  96. dateuntilFilterField.valueProperty()));
  97.  
  98. agefromFilter.bind(Bindings.createObjectBinding(() ->
  99. person -> agefromFilterField.getText().isEmpty() || Integer.parseInt(agefromFilterField.getText()) <= person.getAge(),
  100. agefromFilterField.textProperty()));
  101.  
  102. ageuntilFilter.bind(Bindings.createObjectBinding(() ->
  103. person -> ageuntilFilterField.getText().isEmpty() || Integer.parseInt(ageuntilFilterField.getText()) >= person.getAge(),
  104. ageuntilFilterField.textProperty()));
  105.  
  106. statusFilter.bind(Bindings.createObjectBinding(() ->
  107. statusFilterCheckCombo.getCheckModel().getCheckedItems().isEmpty() ? person-> true : person->
  108. statusFilterCheckCombo.getCheckModel().getCheckedItems().contains(person.getStatus()),
  109. statusFilterCheckCombo.getCheckModel().getCheckedItems()));
  110.  
  111. FilteredList<Person> filteredItems = new FilteredList<>(FXCollections.observableList(createData()));
  112. SortedList<Person> sortedData = new SortedList<>(filteredItems);
  113. sortedData.comparatorProperty().bind(table.comparatorProperty());
  114. table.setItems(sortedData);
  115.  
  116. filteredItems.predicateProperty().bind(Bindings.createObjectBinding(
  117. () -> nameFilter.get().and(genderFilter.get().and(gender2Filter.get().and(datefromFilter.get().and(dateuntilFilter.get().
  118. and(agefromFilter.get().and(ageuntilFilter.get().and(statusFilter.get()))))))),
  119. nameFilter, genderFilter, gender2Filter, datefromFilter, dateuntilFilter, agefromFilter, ageuntilFilter, statusFilter));
  120.  
  121. Button clear = new Button("Clear Filters");
  122. clear.setOnAction(e -> {
  123. /*for (TablePosition<Person, ?> pos : table.getSelectionModel().getSelectedCells()) {
  124. table.getSelectionModel().setCellSelectionEnabled(true);
  125. table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
  126. TableColumn<Person, ?> column = pos.getTableColumn();
  127. ObservableValue<?> obs = column.getCellObservableValue(pos.getRow());
  128. Object value = obs.getValue();
  129. System.out.println(value);
  130. // process value...
  131. }*/
  132. nameFilterField.clear();
  133. datefromFilterField.setValue(null);
  134. dateuntilFilterField.setValue(null);
  135. });
  136.  
  137.  
  138. ObservableList<Person> items = table.getItems();
  139.  
  140. // initialize counts (only needed once, and only if items is non-empty):
  141. int vip = 0 ;
  142. int nonvip = 0;
  143. int total = table.getItems().size();
  144. for (Person item : items) {
  145. if (Person.Status.VIP.equals(item.getStatus())) vip++ ;
  146. if (Person.Status.NONVIP.equals(item.getStatus())) nonvip++ ;
  147. }
  148.  
  149. IntegerProperty vipCount = new SimpleIntegerProperty(vip);
  150. IntegerProperty nonCount = new SimpleIntegerProperty(nonvip);
  151. IntegerProperty totalCount = new SimpleIntegerProperty(total);
  152. totalvip.textProperty().bind(vipCount.asString("VIP: %s"));
  153. totalperson.textProperty().bind(totalCount.asString("Total persons: %s"));
  154.  
  155. PieChart pieChart = new PieChart();
  156. int firstpie = table.getItems().size(), secondpie = 0;
  157. IntegerProperty firstpieCount = new SimpleIntegerProperty(firstpie);
  158. IntegerProperty secondpieCount = new SimpleIntegerProperty(secondpie);
  159. PieChart.Data p1 = new PieChart.Data("First", firstpie);
  160. p1.pieValueProperty().bind(firstpieCount);
  161. PieChart.Data p2 = new PieChart.Data("Second", secondpie);
  162. p2.pieValueProperty().bind(secondpieCount);
  163. ObservableList<PieChart.Data> pieData = FXCollections.observableArrayList(p1,p2);
  164. pieChart.getData().addAll(pieData);
  165. pieChart.setLegendVisible(false);
  166.  
  167. //===============HERE=================================================
  168. items.addListener((
  169. ListChangeListener.Change<? extends Person> c) -> {
  170. while (c.next()) {
  171. if (c.wasAdded()) {
  172. for (Person item : c.getAddedSubList()) {
  173. totalCount.set(totalCount.get() + 1);
  174. secondpieCount.set(totalCount.get());
  175. if (Person.Status.VIP.equals(item.getStatus())) vipCount.set(vipCount.get() + 1) ;
  176. }
  177. }
  178. if (c.wasRemoved()) {
  179. for (Person item : c.getRemoved()) {
  180. totalCount.set(totalCount.get() - 1);
  181. secondpieCount.set(totalCount.get());
  182. if (Person.Status.VIP.equals(item.getStatus())) vipCount.set(vipCount.get() - 1) ;
  183. if(vipCount.get() < 0 ) vipCount.set(0); //prevent negative
  184. }
  185. }
  186. }
  187. });
  188.  
  189. Button update = new Button("update pie");
  190. update.setOnAction(e -> {
  191. firstpieCount.set(secondpieCount.get());
  192.  
  193. });
  194.  
  195.  
  196. FlowPane filters = new FlowPane( nameFilterField, genderFilterCombo, datefromFilterField, dateuntilFilterField, genderFilterCheckCombo, agefromFilterField,
  197. ageuntilFilterField, statusFilterCheckCombo, clear, update);
  198. HBox labels = new HBox(40, totalperson, totalvip, totalyoungperson, totaloldperson);
  199. filters.setPadding(new Insets(5));
  200. labels.setPadding(new Insets(5));
  201. BorderPane root = new BorderPane(table, filters, pieChart, labels, null);
  202. Scene scene = new Scene(root, 800, 600);
  203. primaryStage.setScene(scene);
  204. primaryStage.show();
  205. }
  206.  
  207. private List<Person> createData() {
  208. return Arrays.asList(
  209. new Person("Jacob Smith", "jacob.smith@example.com", Person.Gender.MALE, LocalDate.parse("2018-08-25"),25, Person.Status.NONVIP),
  210. new Person("Jacob Smith", "jacob.smith@example.com", Person.Gender.MALE, LocalDate.parse("2018-08-26"),24, Person.Status.VIP),
  211. new Person("Jacob Smith", "jacob.smith@example.com", Person.Gender.FEMALE, LocalDate.parse("2018-08-26"),23, Person.Status.VIP),
  212. new Person("Jacob Smith", "jacob.smith@example.com", Person.Gender.MALE, LocalDate.parse("2018-08-25"),25, Person.Status.NONVIP),
  213. new Person("Isabella Johnson", "isabella.johnson@example.com", Person.Gender.FEMALE, LocalDate.parse("2018-08-21"),28, Person.Status.VIP),
  214. new Person("Ethan Williams", "ethan.williams@example.com", Person.Gender.MALE, LocalDate.parse("2018-08-21"),30, Person.Status.VIP),
  215. new Person("Emma Jones", "emma.jones@example.com", Person.Gender.FEMALE, LocalDate.parse("2018-08-29"),18, Person.Status.NONVIP),
  216. new Person("Michael Brown", "michael.brown@example.com", Person.Gender.MALE, LocalDate.parse("2018-08-05"),15, Person.Status.NONVIP)
  217. );
  218. }
  219.  
  220. public static <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue<T>> property) {
  221. TableColumn<S,T> col = new TableColumn<>(title);
  222. col.setCellValueFactory(cellData -> property.apply(cellData.getValue()));
  223. return col ;
  224. }
  225.  
  226.  
  227.  
  228. public static class Person {
  229. public enum Gender {MALE, FEMALE}
  230. public enum Status {VIP, NONVIP}
  231.  
  232. private final StringProperty name = new SimpleStringProperty();
  233. private final StringProperty email = new SimpleStringProperty() ;
  234. private final ObjectProperty<Gender> gender = new SimpleObjectProperty<>();
  235. private final ObjectProperty<LocalDate> birthday = new SimpleObjectProperty<>();
  236. private final IntegerProperty age = new SimpleIntegerProperty();
  237. private final ObjectProperty<Status> status = new SimpleObjectProperty<>();
  238.  
  239. public Person(String name, String email, Gender gender, LocalDate birthday, Integer age, Status status) {
  240. setName(name);
  241. setEmail(email);
  242. setGender(gender);
  243. setBirthday(birthday);
  244. setAge(age);
  245. setStatus(status);
  246. }
  247.  
  248. public ObjectProperty<Status> statusProperty() { return status; }
  249.  
  250. public Status getStatus() { return this.statusProperty().get(); }
  251.  
  252. public void setStatus(Status status) { this.statusProperty().set(status); }
  253.  
  254. public IntegerProperty ageProperty() { return age; }
  255.  
  256. public final int getAge() { return this.ageProperty().get(); }
  257.  
  258. public final void setAge(final Integer age) {this.ageProperty().set(age); }
  259.  
  260. public final ObjectProperty<LocalDate> birthdayProperty(){
  261. return this.birthday;
  262. }
  263.  
  264. public final LocalDate getBirthday() {
  265. return this.birthdayProperty().get();
  266. }
  267.  
  268. public final void setBirthday(final LocalDate birthday) {
  269. this.birthdayProperty().set(birthday);
  270. }
  271.  
  272. public final StringProperty emailProperty() {
  273. return this.email;
  274. }
  275.  
  276. public final String getEmail() {
  277. return this.emailProperty().get();
  278. }
  279.  
  280. public final void setEmail(final String email) {
  281. this.emailProperty().set(email);
  282. }
  283.  
  284. public final ObjectProperty<Gender> genderProperty() {
  285. return this.gender;
  286. }
  287.  
  288. public final Gender getGender() {
  289. return this.genderProperty().get();
  290. }
  291.  
  292. public final void setGender(final Gender gender) {
  293. this.genderProperty().set(gender);
  294. }
  295.  
  296. public final StringProperty nameProperty() {
  297. return this.name;
  298. }
  299.  
  300. public final String getName() { return this.nameProperty().get(); }
  301.  
  302. public final void setName(final String name) {
  303. this.nameProperty().set(name);
  304. }
  305.  
  306. }
  307.  
  308. public static void main(String[] args) {
  309. launch(args);
  310. }
  311. }
Add Comment
Please, Sign In to add comment