
Hallo!
Bis vor kurzem war mein Wissen über das Erstellen jeglicher grafischer Oberfläche Null. Aus diesem Grund wurde beschlossen, das Internet leicht zu wackeln und ein Fenster mit einigen Schaltflächen zu erstellen. Wenn Sie darauf klicken, geschieht etwas. Vielleicht findet in diesem Text jemand Antworten auf die Fragen, die einmal gestellt wurden; Gleichzeitig hoffe ich auf ernsthafte und kompetente Kritik.
Was wird passieren?
Da mein Ziel darin besteht, mit JavaFX umzugehen, muss ich an unserem Fenster eine Funktion entwickeln. Die Idee ist folgende: Erstellen Sie eine Gruppe von Personen (nehmen Sie an, dass sie in einem Unternehmen arbeiten), für die wir jeweils den Namen, das Alter, das Gehalt und den Familienstand kennen. In unserem Fenster werden zum einen Informationen zu jedem von ihnen angezeigt, zum anderen das Gehalt eines Mitarbeiters geändert, zum anderen ein neuer Mitarbeiter hinzugefügt und zum anderen Mitarbeiter gefiltert aus den Werten ihrer Attribute. Das Ergebnis sollte ungefähr so aussehen:

Erste Schritte
Zunächst erstellen wir die Hauptklasse des Unternehmens, von der aus die Anwendung gestartet wird:
package company; public class Company { public static void main(String[] args) { } }
In dieser Klasse werden wir
die Funktionen der Anwendungsklasse erweitern. Daher benötigen wir hauptsächlich die start () -Methode, in der die Hauptaktion ausgeführt wird (wir überspringen Fehler, die bei dieser Methode auftreten; mit anderen Worten, wenn etwas schief geht, wird unser Fenster nicht geschlossen, aber StackTrace-Fehler werden in der Konsole angezeigt). ::
package company; import javafx.application.Application; import javafx.stage.Stage; public class Company extends Application { public void start(Stage primaryStage) throws Exception { } public static void main(String[] args) { launch(args); } }
Großartig. Um mit Vertretern von Mitarbeitern des Unternehmens zusammenzuarbeiten, erstellen Sie die Benutzerklasse: Objekte dieser Klasse und fungieren als Mitarbeiter.
Benutzerklasse package company; public class User { User(String name, int age, int salary, boolean married) { this.name = name; this.age = age; this.salary = salary; this.married = married; } public void changeSalary(int x) { salary = (salary + x <= 0)? 0: salary + x; } public String toString() { return name; } public String getAge() { return String.valueOf(age); } public String getSalary() { return String.valueOf(salary); } public String getMarried() { return (married)? ("married"):("single"); } String name; int age; int salary; boolean married; }
Erstellen
Bisher passiert beim Start der Anwendung nichts für uns. Damit mindestens ein Fenster angezeigt wird, müssen Sie es hinzufügen. Wir werden es tun.
package company; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.stage.Stage; public class Company extends Application { public void start(Stage primaryStage) throws Exception { Scene scene = new Scene(root, WIDTH, HEIGHT); primaryStage.setTitle("Company"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } Group root = new Group(); final private int WIDTH = 1000; final private int HEIGHT = 600; }
Was wir gerade gemacht haben: Wir haben eine Szene von Größe hinzugefügt
gab ihr den Namen "Firma". In unserer Szene gibt es eine Stammgruppe, bei der es sich im Wesentlichen um einen „Container“ handelt, der alle Schaltflächen enthält.
Fügen Sie eine Dropdown-Liste mit unseren Mitarbeitern hinzu. Lassen Sie uns eine HBox erstellen, in die wir unsere Dropdown-Liste userBox der Combobox und eine Schaltfläche einfügen, die Informationen über den Mitarbeiter anzeigt (wir platzieren die HBox in der VBox):
package company; import java.util.ArrayList; import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class Company extends Application { public void start(Stage primaryStage) throws Exception { users.add(new User("Alice", 20, 150, false)); users.add(new User("Bob", 34, 300, true)); users.add(new User("Peter", 18, 100, false)); users.add(new User("Kate", 38, 300, true)); users.add(new User("Steve", 31, 250, true)); users.add(new User("Alan", 62, 500, true)); users.add(new User("Julia", 33, 320, true)); users.add(new User("Patric", 37, 300, true)); users.add(new User("Alexander", 34, 280, true)); users.add(new User("George", 28, 180, true)); users.add(new User("Mary", 22, 190, false)); userBox.getItems().addAll(users); root.getChildren().add(strings); strings.setPadding(new Insets(10, 30, 10, 30)); strings.setSpacing(20); strings.getChildren().add(new Text("Select the user")); strings.getChildren().add(buttonBox); buttonBox.setSpacing(10); buttonBox.getChildren().add(userBox); Scene scene = new Scene(root, WIDTH, HEIGHT); primaryStage.setTitle("Company"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } Group root = new Group(); VBox strings = new VBox(); HBox buttonBox = new HBox(); ComboBox<User> userBox = new ComboBox<>(); final private int WIDTH = 1000; final private int HEIGHT = 600; private ArrayList<User> users = new ArrayList<>(); }

Was sind VBox, HBox und ComboBox?
HBox ist eine Reihe von Schaltflächen, Texten und Eingabefeldern, deren Objekte horizontal nacheinander angeordnet sind. Ähnlich wie VBox ist es dasselbe, speichert jedoch seine Objekte (untergeordneten Objekte) vertikal. Wir werden das folgende Schema verwenden: Erstellen Sie eine VBox, in die wir mehrere HBox'ov einfügen, in die wir jeweils eine Folge von Schaltflächen und Feldern einfügen.
ComboBox ist nur eine Dropdown-Liste.
Jetzt möchten wir eine Schaltfläche erstellen, die Informationen zum ausgewählten Mitarbeiter anzeigt. Fügen Sie die Schaltfläche selbst (Schaltfläche) und das Textfeld (TextField) hinzu, in dem der Text angezeigt wird. Wir fügen diese beiden Objekte zu HBox hinzu:
package company; public class Company extends Application { public void start(Stage primaryStage) throws Exception { buttonBox.setSpacing(10); buttonBox.getChildren().add(userBox); buttonBox.getChildren().add(buttonGetInfo); buttonBox.getChildren().add(textInfo); } Button buttonGetInfo = new Button("Info"); Text textInfo = new Text(); }

Bisher macht dieser Button aber nichts. Damit sie etwas tun kann, muss ihr eine Aktion zugewiesen werden:
buttonGetInfo.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { User u = (User) userBox.getSelectionModel().getSelectedItem(); if (u != null) { textInfo.setText("Age is " + u.getAge() + ", " + "Salary is " + u.getSalary() + ", " + "Relationship: " + u.getMarried()); } else { textInfo.setText("User not selected"); } } });

Weitere Aktionen
Genauso fügen wir zwei weitere HBox hinzu: Im zweiten Fall wird sich das Gehalt ändern, im dritten Fall wird ein neuer Mitarbeiter eingestellt. Aufgrund der Tatsache, dass die Logik hier genau dieselbe ist, überspringen wir die Erklärung dieser Punkte und zeigen sofort das Ergebnis:

Code package company; import java.util.ArrayList; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class Company extends Application { public void start(Stage primaryStage) throws Exception { users.add(new User("Alice", 20, 150, false)); users.add(new User("Bob", 34, 300, true)); users.add(new User("Peter", 18, 100, false)); users.add(new User("Kate", 38, 300, true)); users.add(new User("Steve", 31, 250, true)); users.add(new User("Alan", 62, 500, true)); users.add(new User("Julia", 33, 320, true)); users.add(new User("Patric", 37, 300, true)); users.add(new User("Alexander", 34, 280, true)); users.add(new User("George", 28, 180, true)); users.add(new User("Mary", 22, 190, false)); userBox.getItems().addAll(users); root.getChildren().add(strings); strings.setPadding(new Insets(10, 30, 10, 30)); strings.setSpacing(20); strings.getChildren().add(new Text("Select the user")); strings.getChildren().add(buttonBox); strings.getChildren().add(new Text("Change the salary")); strings.getChildren().add(changeSalaryBox); strings.getChildren().add(new Text("Add new User")); strings.getChildren().add(addUserBox); buttonBox.setSpacing(10); buttonBox.getChildren().add(userBox); buttonBox.getChildren().add(buttonGetInfo); buttonBox.getChildren().add(textInfo); changeSalaryBox.setSpacing(10); changeSalaryBox.getChildren().add(buttonChangeSalary); changeSalaryBox.getChildren().add(howMuchChange); addUserBox.setSpacing(10); addUserBox.getChildren().add(new Text("Name: ")); addUserBox.getChildren().add(name); addUserBox.getChildren().add(new Text("Age: ")); addUserBox.getChildren().add(age); addUserBox.getChildren().add(new Text("Salary: ")); addUserBox.getChildren().add(salary); addUserBox.getChildren().add(new Text("Married: ")); addUserBox.getChildren().add(married); addUserBox.getChildren().add(buttonAddUser); buttonGetInfo.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { User u = (User) userBox.getSelectionModel().getSelectedItem(); if (u != null) { textInfo.setText("Age is " + u.getAge() + ", " + "Salary is " + u.getSalary() + ", " + "Relationship: " + u.getMarried()); } else { textInfo.setText("User not selected"); } } }); buttonChangeSalary.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { User u = (User) userBox.getSelectionModel().getSelectedItem(); if(u != null) { u.changeSalary(Integer.parseInt(howMuchChange.getText())); textInfo.setText("Age is " + u.getAge() + ", " + "Salary is " + u.getSalary() + ", " + "Relationshp: " + u.getMarried()); howMuchChange.clear(); } } }); buttonAddUser.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { String m = married.getText(); boolean mm = (m.equals("married"))? true:false; User u = new User(name.getText(), Integer.parseInt(age.getText()), Integer.parseInt(salary.getText()), mm); users.add(u); userBox.getItems().addAll(u); name.clear(); age.clear(); salary.clear(); married.clear(); } }); Scene scene = new Scene(root, WIDTH, HEIGHT); primaryStage.setTitle("Company"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } Group root = new Group(); VBox strings = new VBox(); HBox buttonBox = new HBox(); ComboBox<User> userBox = new ComboBox<>(); Button buttonGetInfo = new Button("Info"); Text textInfo = new Text(); HBox changeSalaryBox = new HBox(); Button buttonChangeSalary = new Button("Change salary"); TextField howMuchChange = new TextField(); HBox addUserBox = new HBox(); Button buttonAddUser = new Button("Add User"); TextField name = new TextField(); TextField age = new TextField(); TextField salary = new TextField(); TextField married = new TextField(); final private int WIDTH = 1000; final private int HEIGHT = 600; private ArrayList<User> users = new ArrayList<>(); }
Filter
Fügen Sie nun die "Filterung" der Mitarbeiter nach Merkmalen hinzu. Wieder werden wir Listen für Filter hinzufügen, die ComboBox mit derselben Logik verwenden.
package company; public class Company extends Application { public void start(Stage primaryStage) throws Exception { ageFilterBox.getItems().addAll( "no matter", "over 20", "over 30", "over 40" ); salaryFilterBox.getItems().addAll( "no matter", "over 150", "over 250", "over 500" ); relationshipFilterBox.getItems().addAll( "no matter", "married", "single" ); strings.getChildren().add(filters); strings.getChildren().add(resultFilter); filters.setSpacing(10); filters.getChildren().add(new Text("Age")); filters.getChildren().add(ageFilterBox); filters.getChildren().add(new Text("Salary")); filters.getChildren().add(salaryFilterBox); filters.getChildren().add(new Text("Relationship")); filters.getChildren().add(relationshipFilterBox); filters.getChildren().add(filter); filter.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { int age; int index = ageFilterBox.getSelectionModel().getSelectedIndex(); age = (index == 0)? 0: (index == 1)? 21: (index == 2)? 31: 41; int salary; index = salaryFilterBox.getSelectionModel().getSelectedIndex(); salary = (index == 0)? 0 : (index == 1)? 151 : (index == 2)? 251:501; boolean relate; index = relationshipFilterBox.getSelectionModel().getSelectedIndex(); relate = (index == 1)? true: (index == 2)? false: true; List<User> list; if(index != 0) { list = users.stream(). filter(u -> u.age > age). filter(u -> u.salary > salary). filter(u -> u.married == relate). collect(Collectors.toList()); } else { list = users.stream(). filter(u -> u.age > age). filter(u -> u.salary > salary). collect(Collectors.toList()); } String res = ""; for(User u: list) { res += u.toString() + ", "; } resultFilter.setText(res); } }); } HBox filters = new HBox(); ComboBox<String> ageFilterBox = new ComboBox<>(); ComboBox<String> salaryFilterBox = new ComboBox<>(); ComboBox<String> relationshipFilterBox = new ComboBox<>(); Button filter = new Button("filter"); Text resultFilter = new Text(); }

Fertig!
Vollständiger CodeFirmenklasse (Haupt)
package company; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; public class Company extends Application { @Override public void start(Stage primaryStage) throws Exception { users.add(new User("Alice", 20, 150, false)); users.add(new User("Bob", 34, 300, true)); users.add(new User("Peter", 18, 100, false)); users.add(new User("Kate", 38, 300, true)); users.add(new User("Steve", 31, 250, true)); users.add(new User("Alan", 62, 500, true)); users.add(new User("Julia", 33, 320, true)); users.add(new User("Patric", 37, 300, true)); users.add(new User("Alexander", 34, 280, true)); users.add(new User("George", 28, 180, true)); users.add(new User("Mary", 22, 190, false)); userBox.getItems().addAll(users); ageFilterBox.getItems().addAll( "no matter", "over 20", "over 30", "over 40" ); salaryFilterBox.getItems().addAll( "no matter", "over 150", "over 250", "over 500" ); relationshipFilterBox.getItems().addAll( "no matter", "married", "single" ); root.getChildren().add(strings); strings.setPadding(new Insets(10, 30, 10, 30)); strings.setSpacing(20); strings.getChildren().add(new Text("Select the user")); strings.getChildren().add(buttonBox); strings.getChildren().add(new Text("Change the salary")); strings.getChildren().add(changeSalaryBox); strings.getChildren().add(new Text("Add new User")); strings.getChildren().add(addUserBox); strings.getChildren().add(filters); strings.getChildren().add(resultFilter); buttonBox.setSpacing(10); buttonBox.getChildren().add(userBox); buttonBox.getChildren().add(buttonGetInfo); buttonBox.getChildren().add(textInfo); changeSalaryBox.setSpacing(10); changeSalaryBox.getChildren().add(buttonChangeSalary); changeSalaryBox.getChildren().add(howMuchChange); addUserBox.setSpacing(10); addUserBox.getChildren().add(new Text("Name: ")); addUserBox.getChildren().add(name); addUserBox.getChildren().add(new Text("Age: ")); addUserBox.getChildren().add(age); addUserBox.getChildren().add(new Text("Salary: ")); addUserBox.getChildren().add(salary); addUserBox.getChildren().add(new Text("Married: ")); addUserBox.getChildren().add(married); addUserBox.getChildren().add(buttonAddUser); filters.setSpacing(10); filters.getChildren().add(new Text("Age")); filters.getChildren().add(ageFilterBox); filters.getChildren().add(new Text("Salary")); filters.getChildren().add(salaryFilterBox); filters.getChildren().add(new Text("Relationship")); filters.getChildren().add(relationshipFilterBox); filters.getChildren().add(filter); Scene scene = new Scene(root, WIDTH, HEIGHT); primaryStage.setTitle("Company"); primaryStage.setScene(scene); primaryStage.show(); buttonGetInfo.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { User u = (User) userBox.getSelectionModel().getSelectedItem(); if (u != null) { textInfo.setText("Age is " + u.getAge() + ", " + "Salary is " + u.getSalary() + ", " + "Relationship: " + u.getMarried()); } else { textInfo.setText("User not selected"); } } }); buttonChangeSalary.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { User u = (User) userBox.getSelectionModel().getSelectedItem(); if(u != null) { u.changeSalary(Integer.parseInt(howMuchChange.getText())); textInfo.setText("Age is " + u.getAge() + ", " + "Salary is " + u.getSalary() + ", " + "Relationshp: " + u.getMarried()); howMuchChange.clear(); } } }); buttonAddUser.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { String m = married.getText(); boolean mm = (m.equals("married"))? true:false; User u = new User(name.getText(), Integer.parseInt(age.getText()), Integer.parseInt(salary.getText()), mm); users.add(u); userBox.getItems().addAll(u); name.clear(); age.clear(); salary.clear(); married.clear(); } }); filter.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) { int age; int index = ageFilterBox.getSelectionModel().getSelectedIndex(); age = (index == 0)? 0: (index == 1)? 21: (index == 2)? 31: 41; int salary; index = salaryFilterBox.getSelectionModel().getSelectedIndex(); salary = (index == 0)? 0 : (index == 1)? 151 : (index == 2)? 251:501; boolean relate; index = relationshipFilterBox.getSelectionModel().getSelectedIndex(); relate = (index == 1)? true: (index == 2)? false: true;
Benutzerklasse
package company; public class User { User(String name, int age, int salary, boolean married) { this.name = name; this.age = age; this.salary = salary; this.married = married; } public void changeSalary(int x) { salary = (salary + x <= 0)? 0: salary + x; } public String toString() { return name; } public String getAge() { return String.valueOf(age); } public String getSalary() { return String.valueOf(salary); } public String getMarried() { return (married)? ("married"):("single"); } String name; int age; int salary; boolean married; }
Was war das
Das Programm selbst stellt keine Nützlichkeit dar und wurde
ausschließlich geschrieben, um sich mit JavaFX und seinen Tools vertraut zu machen. An einigen Stellen, beispielsweise beim Ändern eines Gehalts, werden die Optionen nicht berücksichtigt, wenn der Benutzer nicht ausgewählt ist oder wenn eine Zeile eingegeben wird. In diesen Fällen wird ein Fehler angezeigt. Gleiches gilt für die Felder, in denen beim Hinzufügen neuer Mitarbeiter Informationen eingegeben werden. Und schließlich tritt ein Fehler auf, wenn in keiner der Dropdown-Listen ein Wert ausgewählt ist. Auf Wunsch kann jeder seinen eigenen "Umweg" zu diesen Momenten hinzufügen.
Beim Schreiben von Filtern habe ich übrigens die berüchtigte StreamAPI und verwendet
-Ausdrücke, die den Code verkürzen, erleichtern das Verständnis und den Charme.
Quellen:- JavaFX 8 - Oracle-Hilfe
- Ein wenig über die Erstellung und historische Änderungen von JavaFX
- Wunderbarer Artikel vedenin1980 über StreamAPI und -Ausdrücke