
مرحبًا
حتى وقت قريب ، كانت معرفتي بإنشاء أي نوع من الواجهات الرسومية صفرًا. لذلك ، تقرر تحريك الإنترنت قليلاً وإنشاء نافذة مع بعض الأزرار ، عند النقر ، سيحدث شيء ما. ربما في هذا النص ، سيجد شخص ما إجابات على الأسئلة التي أثيرت ذات مرة ؛ في نفس الوقت ، آمل في انتقاد جدي وكفء.
ماذا سيحدث؟
نظرًا لأن هدفي هو التعامل مع JavaFX ، فأنا بحاجة إلى ابتكار نوع من الوظائف في نافذتنا. الفكرة هي: إنشاء مجموعة من الناس (افترض أنهم يعملون في شركة) ، لكل منهم سنعرف الاسم والعمر والمرتب والحالة الاجتماعية. ستعرض نافذتنا ، أولاً ، معلومات حول كل منهم ، وثانيًا ، تغيير راتب الموظف ، ثالثًا ، القدرة على إضافة موظف جديد ، وأخيرًا ، رابعًا ، ستكون قادرة على تصفية الموظفين وفقًا من قيم صفاتهم. يجب أن تكون النتيجة شيء من هذا القبيل:

الشروع في العمل
بادئ ذي بدء ، نقوم بإنشاء الفئة الرئيسية للشركة ، حيث سيتم إطلاق التطبيق:
package company; public class Company { public static void main(String[] args) { } }
في هذه الفئة ، سوف نقوم
بتوسيع إمكانيات فئة التطبيق. من خلال ذلك ، نحتاج بشكل أساسي إلى طريقة start () ، حيث سيتم تنفيذ الإجراء الرئيسي (سنتخطى الأخطاء التي تحدث في هذه الطريقة ؛ وبعبارة أخرى ، إذا حدث خطأ ما ، فلن تغلق نافذتنا ، ولكن ستظهر أخطاء StackTrace في وحدة التحكم) :
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); } }
عظيم. من أجل العمل مع ممثلي موظفي الشركة ، قم بإنشاء فئة المستخدم: كائنات من هذه الفئة وستعمل كموظفين.
فئة المستخدم 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; }
إنشاء
حتى الآن ، عندما يبدأ التطبيق ، لا يحدث لنا شيء. لتظهر نافذة على الأقل ، يجب إضافتها. سنفعل ذلك.
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; }
ما فعلناه للتو: أضفنا مشهدًا بالحجم

، أعطتها اسم "الشركة". توجد مجموعة
جذر في المشهد الخاص بنا ، وهي في الأساس "حاوية" تحتوي على جميع الأزرار.
أضف قائمة منسدلة مع موظفينا. قم بإنشاء HBox ، حيث نضع القائمة المنسدلة الخاصة بنا userBox المنسدلة وزرًا يعرض معلومات حول الموظف (سنضع HBox في 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<>(); }

ما هي VBox و HBox و ComboBox
HBox عبارة عن مجموعة من الأزرار والنصوص وحقول الإدخال ، حيث يتم ترتيب كل كائن بشكل أفقي بالتسلسل. مشابه له ، VBox هو نفسه ، لكنه يخزن أشياءه (الأطفال) عموديا. سنستخدم المخطط التالي: إنشاء VBox سنضع فيه عدة HBox'ov ، حيث نضع في كل منها سلسلة من الأزرار والحقول.
ComboBox هو قائمة منسدلة نفسها.
نريد الآن إنشاء زر يعرض معلومات حول الموظف المحدد. أضف الزر نفسه (Button) وحقل النص (TextField) ، حيث سيتم عرض النص. نضيف هذين الجسمين إلى HBox:
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(); }

ولكن حتى الآن هذا الزر لا يفعل شيئا. لكي تفعل شيئًا ، يجب أن يتم تكليفها بإجراء:
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"); } } });

إجراءات أخرى
بنفس الطريقة تمامًا ، نضيف HBox إضافيين: في الثانية سيكون هناك تغيير في الراتب ، في الثالث - إضافة موظف جديد. نظرًا لحقيقة أن المنطق هنا هو نفسه تمامًا ، فإننا نتخطى تفسير هذه النقاط ونعرض النتيجة على الفور:

كود 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<>(); }
مرشحات
أضف الآن "تصفية" الموظفين حسب الخصائص. مرة أخرى ، سنضيف قوائم للفلاتر باستخدام ComboBox باستخدام نفس المنطق.
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(); }

انتهى!
كود كاملفئة الشركة (الرئيسية)
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;
فئة المستخدم
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; }
ما هذا
البرنامج نفسه لا يمثل أي فائدة وقد تمت كتابته
فقط من أجل التعرف على JavaFX وأدواته. في بعض الأماكن ، على سبيل المثال ، عند تغيير الراتب ، لا تؤخذ الخيارات في الاعتبار عند عدم تحديد المستخدم ، أو عند إدخال سطر: في هذه الحالات ، سيظهر خطأ. الأمر نفسه ينطبق على الحقول التي يتم إدخال المعلومات عند إضافة موظفين جدد. وأخيرًا ، سيحدث خطأ إذا لم يتم تحديد بعض القيمة في أي من القوائم المنسدلة. يمكن للجميع ، إذا رغبت في ذلك ، إضافة "التفاف" خاص بهم لهذه اللحظات.
عند كتابة المرشحات ، بالمناسبة ، استخدمت StreamAPI سيئة السمعة و
lambda تضيف التعبيرات التي تقصر الشفرة سهولة الفهم والسحر إليها.
مصادر:- JavaFX 8 - مركز تعليمات أوراكل
- القليل عن إنشاء وتعديل JavaFX
- مقال رائع vedenin1980 عن StreamAPI و lambda - تعبيرات