JavaRush /Blog Java /Random-VI /Giới thiệu về Java FX

Giới thiệu về Java FX

Xuất bản trong nhóm
Một ngày nọ, tôi nảy ra ý tưởng viết một ứng dụng máy tính để bàn nhỏ cho nhu cầu của mình - một thứ giống như một cuốn từ điển nhỏ để học từ nước ngoài - và tôi bắt đầu vắt óc, làm sao tôi có thể làm được điều này? Đương nhiên, điều đầu tiên tôi nghĩ đến là Swing. Mọi người có lẽ đã nghe nói về Swing . Đây là thư viện để tạo giao diện người dùng, đồ họa. Do Oracle yêu quý của chúng ta vẫn chưa hoàn toàn từ bỏ Swing nên nó không bị coi là lỗi thời và các ứng dụng vẫn chạy trên đó. Tuy nhiên, nó không còn được Swing hiện đại hóa nữa và những người ở Oracle đã cho chúng ta biết tương lai của JavaFX sẽ như thế nào. Và trên thực tế, JavaFX sử dụng các thành phần Swing làm nhà cung cấp dịch vụ)

JavaFX là gì?

JavaFX về cơ bản là một bộ công cụ GUI cho Java. Sẽ có một sự lạc đề nhỏ ở đây và chúng ta sẽ nhớ GUI là gì : Giao diện người dùng đồ họa - giao diện người dùng đồ họa là một loại giao diện người dùng trong đó tất cả các thành phần (nút, menu, biểu tượng, danh sách) được hiển thị cho người dùng trên hiển thị được thực hiện dưới dạng hình ảnh, đồ họa... Không giống như giao diện dòng lệnh, trong GUI, người dùng có quyền truy cập ngẫu nhiên vào các đối tượng hiển thị bằng thiết bị đầu vào. Thông thường, các thành phần giao diện được triển khai dưới dạng ẩn dụ và hiển thị các thuộc tính cũng như mục đích của chúng để giúp người dùng dễ hiểu hơn. JavaFX nhằm mục đích tạo trò chơi và ứng dụng máy tính để bàn bằng Java. Trên thực tế, nó sẽ thay thế Swing do công cụ GUI mới được đề xuất cho Java. Ngoài ra, nó cho phép chúng ta tạo kiểu cho các tệp bố cục GUI (XML) và làm cho chúng thanh lịch hơn bằng cách sử dụng CSS, tương tự như những gì chúng ta đã quen trong các ứng dụng web. Ngoài ra, JavaFX còn xử lý đồ họa 3D tích hợp cũng như các ứng dụng âm thanh, video và mạng nhúng trong một bộ công cụ GUI duy nhất... Nó rất dễ học và được tối ưu hóa tốt. Nó hỗ trợ nhiều hệ điều hành, cũng như Windows, hệ thống UNIX và Mac OS. Giới thiệu về Java FX - 3

Các tính năng của JavaFX:

  • JavaFX ban đầu đi kèm với một tập hợp lớn các phần giao diện đồ họa, chẳng hạn như tất cả các loại nút, trường văn bản, bảng, cây, menu, biểu đồ, v.v., điều này sẽ giúp chúng ta tiết kiệm rất nhiều thời gian.
  • JavaFX thường sử dụng các kiểu CSS và chúng ta sẽ có thể sử dụng định dạng FXML đặc biệt để tạo GUI, thay vì thực hiện bằng mã Java. Điều này giúp bạn dễ dàng nhanh chóng bố trí GUI hoặc thay đổi giao diện hoặc bố cục mà không cần phải loay hoay với mã Java trong thời gian dài.
  • JavaFX có các phần sơ đồ sẵn sàng sử dụng nên chúng ta không phải viết chúng từ đầu bất cứ khi nào bạn cần một sơ đồ cơ bản.
  • Ngoài ra, JavaFX còn đi kèm với hỗ trợ đồ họa 3D, điều này thường hữu ích nếu chúng ta đang phát triển một số loại trò chơi hoặc ứng dụng tương tự.
Chúng ta hãy xem xét một chút các thành phần chính của cửa sổ của chúng ta:
  • Giai đoạn về cơ bản là một cửa sổ xung quanh hoạt động như một khung vẽ bắt đầu và chứa các thành phần còn lại. Một ứng dụng có thể có nhiều giai đoạn, nhưng trong mọi trường hợp đều phải có một thành phần như vậy. Về cơ bản, Giai đoạn là nơi chứa và điểm vào chính.
  • Cảnh - hiển thị nội dung của sân khấu (giống như một con búp bê làm tổ). Mỗi giai đoạn có thể chứa một số thành phần - cảnh, có thể được chuyển đổi giữa chúng. Trong nội bộ, điều này được triển khai bằng một biểu đồ đối tượng được gọi là Biểu đồ cảnh (trong đó mỗi phần tử là một nút, còn được gọi là Node ).
  • Nút là các nút điều khiển, chẳng hạn như nút nhãn hoặc thậm chí là bố cục, có thể có nhiều thành phần lồng nhau bên trong chúng. Mỗi cảnh có thể có một nút lồng nhau nhưng nó có thể là một bố cục có nhiều thành phần. Việc lồng nhau có thể có nhiều cấp độ, với các bố cục chứa các bố cục khác và các thành phần thông thường. Mỗi nút như vậy có mã định danh, kiểu, hiệu ứng, trạng thái và trình xử lý sự kiện riêng.
Giới thiệu về Java FX - 4 Vì vậy, hãy di chuyển một chút về phía mã. Vì tôi sử dụng Java 8 nên tôi không cần phải lấy bất kỳ phần phụ thuộc nào, vì JavaFx có trong JDK theo mặc định (như trong Java 9.10), nhưng nếu chúng tôi có Java 11+, thì chúng tôi cần truy cập kho lưu trữ maven và kéo nó từ đó phụ thuộc.

JavaFX: ví dụ sử dụng

Chúng tôi tạo một lớp thông thường với một phương thức main(điểm vào):
public class AppFX extends Application {

    public static void main(String[] args) {
        Application.launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Ở đây lớp của chúng tôi kế thừa từ javafx.application.Application(mà chúng tôi có từ hộp Bugaga). Về cơ bản, chúng tôi gọi phương thức Ứng dụng tĩnh launch()để khởi chạy cửa sổ của mình. Ngoài ra, ý tưởng của chúng tôi sẽ phàn nàn rằng chúng tôi chưa triển khai phương thức Ứng dụng, startđây là điều cuối cùng chúng tôi làm. Nó dùng để làm gì? Và để có thể quản lý các thuộc tính (chức năng của cửa sổ của chúng tôi). Để thực hiện việc này, chúng tôi sử dụng một đối số đến primaryStagemà chúng tôi gọi là một phương thức showđể có thể thấy cửa sổ đang được khởi chạy trong main. Hãy điền vào phương pháp của chúng tôi một chút start:
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Dogs application");
    primaryStage.setWidth(500);
    primaryStage.setHeight(400);

    InputStream iconStream =
    getClass().getResourceAsStream("/images/someImage.png");
    Image image = new Image(iconStream);
    primaryStage.getIcons().add(image);

    Button button = new Button("WOF WOF ???'");

    button.setOnAction(e -< {
      Alert alert = new Alert(Alert.AlertType.INFORMATION, "WOF WOF WOF!!!");
        alert.showAndWait();
    });
    Scene primaryScene = new Scene(button);
    primaryStage.setScene(primaryScene);

    primaryStage.show();
}
Vậy chúng ta thấy gì ở đây? Chúng ta hãy xem từng dòng một: 2 - đặt tên của chính cửa sổ (giai đoạn) 3.4 - đặt kích thước của nó 6.7 - đặt đường dẫn của luồng đọc đến tệp (biểu tượng) Giới thiệu về Java FX - 58 - tạo tệp dưới dạng đối tượng Hình ảnh, được kết nối với tệp thực bằng luồng được truyền trong hàm tạo 9 - đặt biểu tượng ở bảng trên cùng của cửa sổ 11 - tạo đối tượng nút 13-16 - đặt phản ứng khi nhấn nút 17 - tạo cảnh trong đó chúng ta đặt nút 18 - đặt cảnh trên cửa sổ chung 20 - đặt cờ hiển thị cho cửa sổ Và kết quả là chúng ta có một cửa sổ nhỏ để chào đón các pesels yêu thích của mình: Giới thiệu về Java FX - 6Mọi thứ trông đơn giản hơn nhiều so với Swing, phải không? Nhưng nó vẫn chưa kết thúc. Sẽ không tốt nếu viết tất cả mã để hiển thị một ứng dụng, bạn cần phải phân chia nó bằng cách nào đó để làm cho nó dễ hiểu hơn (các thành phần đồ họa trong một giỏ, logic trong một giỏ khác). Và ở đây xml xuất hiện trong hình ảnh ... Ôi chúa ơi, xml? Chính xác. Cụ thể, chúng tôi sử dụng cách triển khai cụ thể của nó cho JavaFX - FXML, trong đó chúng tôi xác định các thành phần đồ họa của ứng dụng và các thuộc tính của chúng (tất cả các loại kích thước, v.v.), sau đó kết nối nó với bộ điều khiển, giúp quản lý logic. Hãy xem một ví dụ về xml này:
<?xml version="1.0" encoding="UTF-8"?>
<?language javascript?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx"  xmlns:fx="http://javafx.com/fxml"
   id="Dogs application" prefHeight="200" prefWidth="300" alignment="center">

  <Label text="Wow wow?"/>

  <Button fx:id="mainButton" text="Greeting" onAction="buttonClicked()"/>

    <fx:script>
       function buttonClicked() {
            mainButton.setText("Wow wow wow!!!")
       }
    </fx:script>
</VBox>
2 - ngôn ngữ kịch bản chúng tôi sử dụng 4-6 - dữ liệu đã nhập 8-9 Vbox - vùng chứa đặt các thành phần phụ trên một dòng. 11 - hiển thị một số văn bản 13 - một nút, khi được nhấp vào, chúng tôi sử dụng phương thức được mô tả trong tập lệnh ở dòng 15-18. Cần có mã để gọi tệp xml này trong phương thức start, nhưng bây giờ điều này không quá quan trọng và chúng tôi sẽ bỏ qua (bên dưới sẽ có ví dụ kéo file này). Vì vậy, xml tất nhiên là tốt (nhưng không tốt lắm), viết chúng bằng tay rất khó hiểu, chẳng phải đây là thế kỷ trước sao? Giới thiệu về Java FX - 7

Giới thiệu JavaFX SceneBuilder

Tại thời điểm này (trống cuộn) phát huy tác dụng - SceneBuilder Trong JavaFX Scene Builder là một công cụ mà chúng ta có thể thiết kế các cửa sổ của mình dưới dạng giao diện đồ họa, sau đó lưu chúng và chương trình này, dựa trên kết quả, sẽ xây dựng các tệp xml mà chúng tôi sẽ cải thiện nó trong ứng dụng của mình. Giao diện của trình tạo fmxl này trông giống như thế này: Giới thiệu về Java FX - 8

Một sự lạc đề nhỏ. Bài học JavaFX

Tôi sẽ bỏ qua chi tiết cài đặt và nghiên cứu chi tiết về công cụ này. Đây là những chủ đề đáng để khám phá thêm. Vì vậy, tôi vẫn sẽ để lại một số liên kết thú vị đến các bài học JavaFX: một (hướng dẫn trực tuyến về JavaFX) và hai (một hướng dẫn hay khác). Hãy xem qua một ví dụ nhỏ mà tôi đã phác thảo. Cuối cùng tôi nhận được một cái gì đó như: Giới thiệu về Java FX - 9
(giống như một cửa sổ để đăng ký chó)
Khi bạn chọn một con chó và nhấn nút Xóa, con chó đó sẽ bị xóa khỏi danh sách của chúng tôi. Khi bạn chọn một người bạn bốn chân và thay đổi các trường của nó, đồng thời sau khi nhấn nút Chỉnh sửa, thông tin về chú chó sẽ được cập nhật. Khi chúng ta nhấn nút Mới, một cửa sổ bật lên để tạo bản ghi cho một con chó mới (bắt đầu bằng tên của nó): Giới thiệu về Java FX - 10Sau đó nhấp vào Lưu và điền vào các trường còn lại trong cửa sổ đầu tiên, sau đó nhấp vào nút Chỉnh sửa để cứu. Nghe có vẻ dễ dàng phải không? Hãy xem nó trông như thế nào trong ứng dụng Java của chúng ta. Để bắt đầu, tôi sẽ chỉ để lại ở đây bố cục xml cho hai cửa sổ này được tạo trong SceneBuilder: Đầu tiên (cơ bản):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<AnchorPane prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.BaseController">
   <children>
      <SplitPane dividerPositions="0.29797979797979796" prefHeight="300.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <TableView fx:id="dogs" layoutX="-2.0" layoutY="-4.0" prefHeight="307.0" prefWidth="190.0" AnchorPane.bottomAnchor="-5.0" AnchorPane.leftAnchor="-2.0" AnchorPane.rightAnchor="-13.0" AnchorPane.topAnchor="-4.0">
                    <columns>
                      <TableColumn fx:id="nameList" prefWidth="100.33334350585938" text="Nickname" />
                    </columns>
                     <columnResizePolicy>
                        <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
                     </columnResizePolicy>
                  </TableView>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <Label layoutX="49.0" layoutY="25.0" text="Person Details" AnchorPane.leftAnchor="5.0" AnchorPane.topAnchor="5.0" />
                  <GridPane accessibleText="erreererer" gridLinesVisible="true" layoutX="5.0" layoutY="31.0" AnchorPane.leftAnchor="5.0" AnchorPane.rightAnchor="5.0" AnchorPane.topAnchor="31.0">
                    <columnConstraints>
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                      <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
                    </columnConstraints>
                    <rowConstraints>
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                      <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
                    </rowConstraints>
                     <children>
                        <Label prefHeight="17.0" prefWidth="70.0" text="Nickname" />
                        <Label text="Breed" GridPane.rowIndex="1" />
                        <Label text="Age" GridPane.rowIndex="2" />
                        <Label text="City" GridPane.rowIndex="3" />
                        <Label text="Level of training" GridPane.rowIndex="4" />
                        <TextField fx:id="breed" GridPane.columnIndex="1" GridPane.rowIndex="1" />
                        <TextField fx:id="age" GridPane.columnIndex="1" GridPane.rowIndex="2" />
                        <TextField fx:id="city" GridPane.columnIndex="1" GridPane.rowIndex="3" />
                        <TextField fx:id="levelOfTraining" GridPane.columnIndex="1" GridPane.rowIndex="4" />
                        <TextField fx:id="name" GridPane.columnIndex="1" />
                     </children>
                  </GridPane>
                  <Button layoutX="251.0" layoutY="259.0" mnemonicParsing="false" onAction="#create" text="New" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="230.0" AnchorPane.rightAnchor="130.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="316.0" layoutY="262.0" mnemonicParsing="false" onAction="#edit" text="Edit" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="290.0" AnchorPane.rightAnchor="70.0" AnchorPane.topAnchor="260.0" />
                  <Button layoutX="360.0" layoutY="262.0" mnemonicParsing="false" onAction="#delete" text="Delete" AnchorPane.bottomAnchor="10.0" AnchorPane.leftAnchor="350.0" AnchorPane.rightAnchor="10.0" AnchorPane.topAnchor="260.0" />
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </children>
</AnchorPane>
Thứ hai (để tạo chó con mới):
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.tutorial.controller.NewDogController">
   <children>
      <GridPane layoutX="31.0" layoutY="25.0" prefHeight="122.0" prefWidth="412.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="185.0" minWidth="10.0" prefWidth="149.0" />
          <ColumnConstraints hgrow="SOMETIMES" maxWidth="173.0" minWidth="10.0" prefWidth="146.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <Label prefHeight="48.0" prefWidth="178.0" text="Please, write name:">
               <font>
                  <Font size="20.0" />
               </font>
            </Label>
            <TextField fx:id="nickName" prefHeight="36.0" prefWidth="173.0" GridPane.columnIndex="1" />
         </children>
      </GridPane>
      <Button layoutX="222.0" layoutY="149.0" mnemonicParsing="false" onAction="#ok" prefHeight="37.0" prefWidth="95.0" text="Save" />
      <Button layoutX="325.0" layoutY="149.0" mnemonicParsing="false" onAction="#cansel" prefHeight="37.0" prefWidth="95.0" text="Cansel" />
   </children>
</AnchorPane>
Cấu trúc thư mục trông như thế nào: Giới thiệu về Java FX - 11Như bạn có thể thấy, không có gì đặc biệt, có những bộ điều khiển đại diện cho một số cửa sổ nhất định, có những mô hình đại diện cho dữ liệu của chúng ta. Chúng ta hãy xem lớp khởi chạy ứng dụng (Triển khai ứng dụng): @Data
public class AppFX extends Application {

    private Stage primaryStage;
    private AnchorPane rootLayout;
    private ObservableList listDog = FXCollections.observableArrayList();

    public AppFX() {
        listDog.add(new Dog("Fluffy", "Pug", 8, "Odessa", 2));
        listDog.add(new Dog("Archie", "Poodle", 3, "Lviv", 6));
        listDog.add(new Dog("Willie", "Bulldog", 5, "Kiev", 4));
        listDog.add(new Dog("Hector", "Shepherd", 9, "Minsk", 6));
        listDog.add(new Dog("Duncan", "Dachshund", 1, "Hogwarts", 9));
    }
Ở đây, chúng ta thấy một hàm tạo sẽ điền dữ liệu ban đầu của chúng ta (mà chúng ta lưu trữ trong một trang đặc biệt - ObservableList).
public static void main(String[] args) {
        Application.launch();
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("Dogs application");
        showBaseWindow();
}
Không có gì đặc biệt - mainvà cách triển start()khai khởi chạy ứng dụng:
public void showBaseWindow() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/rootWindow.fxml"));
            rootLayout = loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            InputStream iconStream = getClass().getResourceAsStream("/icons/someImage.png");
            Image image = new Image(iconStream);
            primaryStage.getIcons().add(image);
            BaseController controller = loader.getController();
            controller.setAppFX(this);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Vì vậy, ở đây chúng ta thấy phương thức mà chúng ta thực sự khởi chạy trong start(), cụ thể là phương thức đặt cài đặt của cửa sổ cơ sở của chúng ta. Chẳng hạn như trong bố cục xml trong tài nguyên: đặt cho nó một biểu tượng, liên kết nó với một bộ điều khiển cụ thể và cung cấp cho bộ điều khiển một liên kết đến thislớp)
public void showCreateWindow(Dog dog) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(AppFX.class.getResource("/maket/new.fxml"));
            AnchorPane page = loader.load();
            Stage dialogStage = new Stage();
            dialogStage.setTitle("Wow Wow Wow");
            dialogStage.initModality(Modality.WINDOW_MODAL);
            dialogStage.initOwner(primaryStage);
            dialogStage.setScene(new Scene(page));
            CreateController controller = loader.getController();
            controller.setDialogStage(dialogStage);
            controller.setDog(dog);
            dialogStage.showAndWait();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Ở đây chúng ta thấy phương thức chịu trách nhiệm cho sự xuất hiện của cửa sổ thứ hai - cửa sổ tạo bản ghi mới (tên của một con chó mới). Chúng tôi cũng thiết lập bộ điều khiển, bố cục xml, giai đoạn, v.v... Lớp tiếp theo mà chúng tôi sẽ xem xét sẽ là một mô hình đại diện cho con chó của chúng tôi (thông tin về nó): @Data
public class Dog {

    private StringProperty name;
    private StringProperty breed;
    private IntegerProperty age;
    private StringProperty city;
    private IntegerProperty levelOfTraining;

    public Dog(String name, String breed, int age, String city, int levelOfTraining) {
        this.name = new SimpleStringProperty(name);
        this.breed = new SimpleStringProperty(breed);
        this.age = new SimpleIntegerProperty(age);
        this.city = new SimpleStringProperty(city);
        this.levelOfTraining = new SimpleIntegerProperty(levelOfTraining);
    }

    public Dog() {
        name = new SimpleStringProperty();
        breed = null;
        age = null;
        city = null;
        levelOfTraining = null;
    }
}
Ở đây chúng ta thấy hai hàm tạo. Một hàm gần như thông thường với tất cả các đối số (gần như là do chúng tôi sử dụng các hàm bao FX đặc biệt thuộc các kiểu đơn giản) và một hàm tạo không có đối số: chúng tôi sử dụng nó khi tạo một con chó mới, lúc đầu nó chỉ có một tên. Bộ điều khiển cho cửa sổ cơ bản: @Data
public class BaseController {

    @FXML
    private TableView dogs;
    @FXML
    private TableColumn nameList;
    @FXML
    private TextField name;
    @FXML
    private TextField breed;
    @FXML
    private TextField age;
    @FXML
    private TextField city;
    @FXML
    private TextField levelOfTraining;
    private AppFX appFX;
Ở đây chúng ta thấy các trường đối tượng của mình, nhưng ở định dạng TextField. Đây là định dạng đại diện cho trường nhập văn bản. @FXML là một chú thích được thiết kế để liên kết mã Java và đối tượng tương ứng trong bố cục của chúng ta (nút, trường hoặc thứ gì khác).
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Ở đây chúng ta thấy một phương thức hiển thị tên chó, ở bên phải danh sách (chú thích @FXML của nó liên kết với thành phần bố cục JavaFX TableView).
public void setAppFX(AppFX appFX) {
    this.appFX = appFX;
    dogs.setItems(appFX.getListDog());
}

private void showDogsInformation(Dog dog) {
    if (dog != null) {
        name.setText(dog.getName() != null ? dog.getName().getValue() : null);
        breed.setText(dog.getBreed() != null ? dog.getBreed().getValue() : null);
        age.setText(dog.getAge() != null ? String.valueOf(dog.getAge().get()) : null);
        city.setText(dog.getCity() != null ? dog.getCity().getValue() : null);
        levelOfTraining.setText(dog.getLevelOfTraining() != null ? String.valueOf(dog.getLevelOfTraining().get()) : null);
    } else {
        name.setText("");
        breed.setText("");
        age.setText("");
        city.setText("");
        levelOfTraining.setText("");
    }
}
Trong phương thức đầu tiên, chúng ta thấy việc thiết lập một tham chiếu nội bộ cho lớp triển khai Ứng dụng (để chúng ta có thể gọi phương thức của nó để gọi cửa sổ thứ hai) và thiết lập danh sách ban đầu sẽ được hiển thị. Lệnh thứ hai kiểm tra xem con chó hiện tại có dữ liệu nhất định hay không và dựa vào đó sẽ đặt các trường văn bản:
@FXML
    private void delete() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().remove(selectedIndex);
    }

    @FXML
    private void edit() {
        int selectedIndex = dogs.getSelectionModel().getSelectedIndex();
        dogs.getItems().set(selectedIndex, new Dog(name.getText(), breed.getText(), Integer.valueOf(age.getText()), city.getText(), Integer.valueOf(levelOfTraining.getText())));
    }

    @FXML
    private void create() {
        Dog someDog = new Dog();
        appFX.showCreateWindow(someDog);
        if (someDog.getName() != null && !someDog.getName().getValue().isEmpty()) {
            appFX.getListDog().add(someDog);
        }
    }
}
Ở đây chúng ta thấy ba phương thức của cửa sổ cơ sở được liên kết với các nút: Giới thiệu về Java FX - 12
  • xóa - xóa con chó đã chọn (đã chọn) theo chỉ mục;
  • chỉnh sửa - tạo một con chó mới với dữ liệu được truyền và đặt nó thay vì dữ liệu trước đó;
  • tạo - chúng ta tạo một con chó mới và gọi phương thức gọi cửa sổ tạo, chuyển một đối tượng mới và sau khi đóng đối tượng đó, nếu tên không rỗng thì hãy lưu thú cưng mới.
Tiếp tục, bộ điều khiển cửa sổ để tạo con chó: @Data
public class CreateController {
    private Stage dialogStage;
    private Dog dog;

    @FXML
    private TextField nickName;

    @FXML
    private void ok() {
        if (nickName != null && !nickName.getText().isEmpty()) {
            dog.setName(new SimpleStringProperty(nickName.getText()));
            dialogStage.close();
        }
    }

    @FXML
    private void cansel() {
        dialogStage.close();
    }
}
Ở đây chúng ta thấy kết nối với trường văn bản trong cửa sổ, xử lý các nút Lưu và Hủy, bằng cách nào đó sẽ đóng cửa sổ. Như bạn có thể thấy, để thuận tiện hơn cho ứng dụng nhỏ của mình, tôi đã sử dụng Lombok, nếu không thì mã sẽ phát triển rất nhiều và tôi sẽ không đưa nó vào bài đánh giá của mình. Có lẽ đó là tất cả những gì tôi có cho ngày hôm nay. Hôm nay chúng ta đã làm quen ngắn gọn với các khái niệm cơ bản và ví dụ về cách sử dụng JavaFX và chúng ta có thể xây dựng các ứng dụng máy tính để bàn nhỏ (sử dụng thông tin bổ sung, may mắn thay, có rất nhiều thông tin trên Internet). Và đến lượt bạn, thích))
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION