JavaRush /Blog Java /Random-MS /Pengenalan kepada Java FX

Pengenalan kepada Java FX

Diterbitkan dalam kumpulan
Suatu hari saya mempunyai idea untuk menulis aplikasi desktop kecil untuk keperluan saya - sesuatu seperti kamus kecil untuk mempelajari perkataan asing - dan saya mula memerah otak saya, bagaimana saya boleh melakukan ini? Sememangnya, perkara pertama yang terlintas di fikiran saya ialah Swing. Semua orang mungkin pernah mendengar tentang Swing . Ini adalah perpustakaan untuk mencipta antara muka grafik pengguna. Disebabkan fakta bahawa Oracle kesayangan kami masih belum meninggalkan Swing sepenuhnya, ia tidak dianggap usang, dan aplikasi masih berjalan padanya. Walau bagaimanapun, ia tidak lagi dimodenkan oleh Swing, dan orang-orang di Oracle telah memberi kami rasa tentang masa depan JavaFX. Dan sebenarnya, JavaFX menggunakan komponen Swing sebagai pembekal perkhidmatan)

Apakah JavaFX?

JavaFX pada asasnya ialah kit alat GUI untuk Java. Akan ada penyimpangan kecil di sini, dan kami akan ingat apa itu GUI : Antara muka pengguna grafik - antara muka pengguna grafik ialah sejenis antara muka pengguna di mana semua elemen (butang, menu, ikon, senarai) dibentangkan kepada pengguna pada paparan dibuat dalam bentuk gambar, grafik . Tidak seperti antara muka baris arahan, dalam GUI pengguna mempunyai akses rawak kepada objek yang boleh dilihat menggunakan peranti input. Selalunya, elemen antara muka dilaksanakan dalam bentuk metafora dan memaparkan sifat dan tujuannya untuk memudahkan pemahaman pengguna. JavaFX bertujuan untuk mencipta permainan dan aplikasi desktop di Java. Malah, ia akan menggantikan Swing kerana alat GUI baharu yang dicadangkan untuk Java. Selain itu, ia membolehkan kami menggayakan fail susun atur GUI (XML) dan menjadikannya lebih elegan menggunakan CSS, sama seperti yang biasa kami gunakan dalam aplikasi web. JavaFX juga mengendalikan grafik 3D bersepadu serta audio, video dan aplikasi rangkaian terbenam dalam kit alat GUI tunggal... Ia mudah dipelajari dan dioptimumkan dengan baik. Ia menyokong banyak sistem pengendalian, serta Windows, sistem UNIX dan Mac OS. Pengenalan kepada Java FX - 3

Ciri-ciri JavaFX:

  • JavaFX pada mulanya datang dengan set besar bahagian antara muka grafik, seperti semua jenis butang, medan teks, jadual, pokok, menu, carta, dll., yang seterusnya akan menjimatkan banyak masa kita.
  • JavaFX sering menggunakan gaya CSS, dan kami akan dapat menggunakan format FXML khas untuk mencipta GUI, dan bukannya melakukannya dalam kod Java. Ini memudahkan untuk menyusun GUI dengan cepat atau menukar rupa atau komposisi tanpa perlu bermain-main dengan kod Java untuk masa yang lama.
  • JavaFX mempunyai bahagian rajah sedia untuk digunakan jadi kami tidak perlu menulisnya dari awal pada bila-bila masa anda memerlukan rajah asas.
  • JavaFX juga dilengkapi dengan sokongan grafik 3D, yang selalunya berguna jika kami membangunkan beberapa jenis permainan atau aplikasi serupa.
Mari kita lihat sedikit komponen utama tetingkap kami:
  • Stage pada asasnya ialah tingkap sekeliling yang bertindak sebagai kanvas permulaan dan mengandungi komponen yang lain. Aplikasi boleh mempunyai beberapa peringkat, tetapi dalam apa jua keadaan mesti ada satu komponen sedemikian. Pada asasnya, Stage ialah wadah utama dan pintu masuk.
  • Adegan - memaparkan kandungan pentas (seperti anak patung bersarang). Setiap peringkat boleh mengandungi beberapa komponen - adegan, yang boleh ditukar antara mereka. Secara dalaman, ini dilaksanakan oleh graf objek yang dipanggil Graf Scene (di mana setiap elemen adalah nod, juga dipanggil Node ).
  • Nod ialah kawalan, seperti butang label, atau juga reka letak, yang boleh mempunyai berbilang komponen bersarang di dalamnya. Setiap adegan boleh mempunyai satu nod bersarang, tetapi ia boleh menjadi reka letak dengan berbilang komponen. Bersarang boleh berbilang peringkat, dengan reka letak yang mengandungi reka letak lain dan komponen biasa. Setiap nod tersebut mempunyai pengecam, gaya, kesan, keadaan dan pengendali acara sendiri.
Pengenalan kepada Java FX - 4 Jadi mari kita bergerak sedikit ke arah kod. Oleh kerana saya menggunakan Java 8, saya tidak perlu mengeluarkan sebarang kebergantungan, kerana JavaFx berada dalam JDK secara lalai (seperti dalam Java 9.10), tetapi jika kita mempunyai Java 11+, maka kita perlu pergi ke repositori maven dan tariknya dari sana kebergantungan.

JavaFX: contoh penggunaan

Kami mencipta kelas biasa dengan kaedah main(titik masuk):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Di sini kelas kami mewarisi daripada javafx.application.Application(yang kami ada dari kotak Bugaga). Secara utama kami memanggil kaedah Aplikasi statik launch()untuk melancarkan tetingkap kami. Selain itu, idea kami akan mengadu bahawa kami tidak melaksanakan kaedah Aplikasi, startyang akhirnya kami lakukan. Untuk apa itu? Dan untuk dapat mengurus sifat (fungsi tetingkap kami). Untuk melakukan ini, kami menggunakan hujah masuk primaryStageyang kami panggil kaedah showsupaya kami dapat melihat tetingkap dilancarkan dalam main. Mari lengkapkan kaedah kami sedikit 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();
}
Jadi apa yang kita lihat di sini? Mari kita melaluinya baris demi baris: 2 - tetapkan nama tetingkap itu sendiri (peringkat) 3.4 - tetapkan dimensinya 6.7 - tetapkan laluan aliran bacaan ke fail (ikon) Pengenalan kepada Java FX - 58 - cipta fail sebagai objek Imej, yang disambungkan kepada fail sebenar oleh aliran yang diluluskan dalam pembina 9 - tetapkan ikon di panel atas tetingkap 11 - cipta objek butang 13-16 - tetapkan tindak balas apabila butang ditekan 17 - cipta adegan di mana kami meletakkan butang kami 18 - letakkan pemandangan pada tetingkap biasa kami 20 - tetapkan bendera keterlihatan untuk tingkap Dan hasilnya kami mendapat tingkap kecil untuk mengalu-alukan pesel kegemaran kami: Pengenalan kepada Java FX - 6Semuanya kelihatan lebih mudah daripada Swing, bukan? Tetapi ia masih belum berakhir. Adalah tidak baik untuk menulis semua kod untuk memaparkan aplikasi; anda perlu membahagikannya entah bagaimana untuk menjadikannya lebih mudah difahami (komponen grafik dalam satu bakul, logik dalam bakul yang lain). Dan di sini xml masuk ke dalam gambar... Ya tuhan, xml? Tepat sekali. Khususnya, kami menggunakan pelaksanaan khusus untuk JavaFX - FXML, di mana kami mentakrifkan komponen grafik aplikasi dan sifatnya (semua jenis saiz, dsb.), dan kemudian menyambungkannya kepada pengawal, yang membantu mengurus logik. Mari lihat contoh xml ini:
<?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 - bahasa skrip yang kami gunakan 4-6 - data yang diimport 8-9 Vbox - bekas yang meletakkan subkomponen pada satu baris. 11 - paparkan beberapa teks 13 - butang, apabila diklik, kami menggunakan kaedah yang diterangkan dalam skrip pada baris 15-18. Perlu ada kod untuk memanggil fail xml ini dalam kaedah start, tetapi sekarang ini tidak begitu penting, dan kami akan meninggalkannya (di bawah akan ada contoh menarik fail ini). Jadi, xml, sudah tentu, bagus (tetapi tidak begitu baik), menulisnya secara manual sangat mengelirukan, bukankah ini abad yang lalu? Pengenalan kepada Java FX - 7

Memperkenalkan JavaFX SceneBuilder

Pada ketika inilah (gelek gendang) mula dimainkan - SceneBuilder Dalam JavaFX Scene Builder ialah alat yang dengannya kita boleh mereka bentuk tingkap kita dalam bentuk antara muka grafik dan kemudian menyimpannya, dan program ini, berdasarkan hasilnya, akan membina fail xml yang kami Kami akan memperbaikinya dalam aplikasi kami. Inilah rupa antara muka pembina fmxl ini: Pengenalan kepada Java FX - 8

Penyimpangan kecil. Pelajaran JavaFX

Saya akan melangkau butiran pemasangan, dan kajian terperinci tentang alat ini juga. Ini adalah topik yang patut diterokai dengan lebih lanjut. Oleh itu, saya masih akan meninggalkan beberapa pautan menarik ke pelajaran JavaFX: satu (tutorial dalam talian tentang JavaFX) dan dua (tutorial lain yang bagus). Mari kita lihat contoh kecil yang saya lakarkan. Pada akhirnya saya mendapat sesuatu seperti: Pengenalan kepada Java FX - 9
(semacam tingkap untuk mendaftarkan anjing)
Apabila anda memilih anjing dan menekan butang Padam, anjing itu dialih keluar daripada senarai kami. Apabila anda memilih rakan berkaki empat dan menukar medannya, dan selepas menekan butang Edit, maklumat anjing itu dikemas kini. Apabila kita menekan butang Baharu, tetingkap muncul untuk mencipta rekod untuk anjing baharu (untuk bermula dengan namanya): Pengenalan kepada Java FX - 10Kemudian klik Simpan dan isikan seluruh medannya dalam tetingkap pertama, dan kemudian klik butang Edit untuk jimat. Bunyinya mudah, bukan? Mari lihat bagaimana ini akan kelihatan dalam aplikasi Java kami. Sebagai permulaan, saya akan tinggalkan di sini susun atur xml untuk dua tetingkap ini yang dijana dalam SceneBuilder: Pertama (asas):
<?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>
Kedua (untuk mencipta anjing baru):
<?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>
Bagaimana rupa struktur folder: Pengenalan kepada Java FX - 11Seperti yang anda lihat, tiada apa yang istimewa, terdapat pengawal yang mewakili tetingkap tertentu, terdapat model yang mewakili data kami. Mari kita lihat kelas yang melancarkan aplikasi (Pelaksanaan aplikasi): @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));
    }
Di sini kita melihat pembina yang akan mengisi data awal kami (yang kami simpan dalam helaian khas - 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();
}
Tiada yang istimewa - maindan pelaksanaan start()yang melancarkan aplikasi:
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();
        }
    }
Jadi, di sini kita melihat kaedah yang sebenarnya kita lancarkan dalam start(), iaitu kaedah yang menetapkan tetapan tetingkap asas kita. Seperti dalam susun atur xml dalam sumber: memberikannya ikon, memautkannya kepada pengawal tertentu, dan memberi pengawal pautan ke thiskelas)
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();
        }
    }
}
Di sini kita melihat kaedah yang bertanggungjawab untuk kemunculan tetingkap kedua - tetingkap untuk mencipta rekod baru (nama anjing baru). Kami juga menetapkan pengawal, susun atur xml, pentas, dll... Kelas seterusnya yang akan kami pertimbangkan ialah model yang mewakili anjing kami (maklumat mengenainya): @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;
    }
}
Di sini kita melihat dua pembina. Satu hampir biasa dengan semua hujah (hampir, kerana kami menggunakan pembalut FX khas jenis mudah) dan pembina tanpa hujah: kami menggunakannya semasa mencipta anjing baru, yang pada mulanya hanya mempunyai nama. Pengawal untuk tetingkap asas: @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;
Di sini kita melihat medan objek kita, tetapi dalam format TextField. Ini ialah format yang mewakili medan input teks. @FXML ialah anotasi yang direka untuk memautkan kod Java dan objek yang sepadan dengan reka letak kami (butang, medan atau sesuatu yang lain).
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Di sini kita melihat kaedah untuk memaparkan nama anjing, di sebelah kanan dalam senarai (anotasi @FXMLnya terikat pada komponen susun atur 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("");
    }
}
Dalam kaedah pertama kita melihat menetapkan rujukan dalaman kepada kelas yang melaksanakan Aplikasi (supaya kita boleh memanggil kaedahnya untuk memanggil tetingkap kedua), dan menetapkan senarai awal untuk dipaparkan. Yang kedua menyemak sama ada anjing semasa mempunyai data tertentu, dan berdasarkan ini menetapkan medan teks:
@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);
        }
    }
}
Di sini kita melihat tiga kaedah tetingkap asas yang dikaitkan dengan butang: Pengenalan kepada Java FX - 12
  • padam — padamkan anjing yang dipilih (dipilih) mengikut indeks;
  • edit - buat anjing baharu dengan data yang dipindahkan, dan tetapkannya dan bukannya anjing yang sebelumnya;
  • cipta - kami mencipta anjing baru dan memanggil kaedah memanggil tetingkap penciptaan, lulus objek baru, dan selepas menutup yang, jika nama itu tidak batal, kemudian simpan haiwan peliharaan baru.
Bergerak, pengawal tetingkap untuk mencipta anjing: @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();
    }
}
Di sini kita melihat sambungan dengan medan teks dalam tetingkap, memproses butang Simpan dan Batal, yang entah bagaimana menutup tetingkap. Seperti yang anda boleh lihat, untuk kemudahan yang lebih besar dalam aplikasi kecil saya, saya menggunakan Lombok, jika tidak, kod itu akan berkembang dengan pesat, dan saya tidak akan memasukkannya ke dalam ulasan saya. Mungkin itu sahaja yang saya ada untuk hari ini. Hari ini kami berkenalan secara ringkas dengan konsep asas dan contoh penggunaan JavaFX, dan kami boleh membina aplikasi desktop kecil (menggunakan maklumat tambahan, yang, untungnya, banyak terdapat di Internet). Dan anda pula, suka))
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION