JavaRush /Blog Jawa /Random-JV /Pambuka kanggo Java FX

Pambuka kanggo Java FX

Diterbitake ing grup
Sawijining dina, aku duwe ide kanggo nulis aplikasi desktop cilik kanggo kabutuhanku - kaya kamus cilik kanggo sinau tembung manca - lan aku wiwit mikir, kepiye carane aku bisa nindakake iki? Mesthi, bab pisanan sing teka ing pikiranku yaiku Swing. Saben uwong mesthi wis krungu saka Swing . Iki minangka perpustakaan kanggo nggawe pangguna, antarmuka grafis. Amarga kasunyatan sing Oracle kita kinasih durung rampung nilar Swing, iku ora dianggep lungse, lan aplikasi isih mbukak ing. Nanging, ora dimodernisasi maneh dening Swing, lan wong-wong ing Oracle wis menehi kita rasa babagan masa depan JavaFX. Lan nyatane, JavaFX nggunakake komponen Swing minangka panyedhiya layanan)

Apa JavaFX?

JavaFX pancen minangka toolkit GUI kanggo Jawa. Bakal ana digression cilik ing kene, lan kita bakal ngelingi apa iku GUI : Antarmuka pangguna grafis - antarmuka panganggo grafis minangka jinis antarmuka panganggo sing kabeh unsur (tombol, menu, lambang, dhaptar) diwenehake marang pangguna ing tampilan digawe ing wangun gambar, grafis. Ora kaya antarmuka baris perintah, ing GUI pangguna duwe akses acak menyang obyek sing katon nggunakake piranti input. Asring, unsur antarmuka diimplementasikake ing bentuk metafora lan nampilake sifat lan tujuane kanggo nggampangake pemahaman pangguna. JavaFX ditujokake kanggo nggawe game lan aplikasi desktop ing Jawa. Nyatane, bakal ngganti Swing amarga alat GUI anyar sing diusulake kanggo Jawa. Iki uga ngidini kita nggawe file tata letak GUI (XML) lan nggawe luwih elegan nggunakake CSS, padha karo apa sing kita gunakake ing aplikasi web. JavaFX uga nangani grafis 3D terintegrasi uga audio, video lan aplikasi jaringan sing dipasang ing toolkit GUI siji... Gampang sinau lan dioptimalake kanthi apik. Ndhukung akeh sistem operasi, uga Windows, sistem UNIX lan Mac OS. Pambuka Java FX - 3

Fitur JavaFX:

  • JavaFX wiwitane dilengkapi karo akeh bagean antarmuka grafis, kayata kabeh tombol, kolom teks, tabel, wit, menu, grafik, lan sapiturute, sing bakal ngirit wektu akeh.
  • JavaFX asring nggunakake gaya CSS, lan kita bakal bisa nggunakake format FXML khusus kanggo nggawe GUI, tinimbang nindakake ing kode Jawa. Iki nggampangake lay out GUI cepet utawa ngganti tampilan utawa komposisi tanpa kudu muter-muter karo kode Jawa kanggo dangu.
  • JavaFX duwe bagean diagram sing siap digunakake supaya kita ora kudu nulis saka awal kapan wae sampeyan butuh diagram dhasar.
  • JavaFX uga dilengkapi dhukungan grafis 3D, sing asring migunani yen kita ngembangake sawetara jinis game utawa aplikasi sing padha.
Ayo dipikirake komponen utama jendela kita:
  • Stage punika ateges jendhela lingkungan sing tumindak minangka kanvas wiwitan lan ngemot liyane saka komponen. Aplikasi bisa duwe sawetara tahapan, nanging ing kasus apa wae kudu ana siji komponen kasebut. Ateges, Stage minangka wadhah utama lan titik mlebu.
  • Adegan - nampilake isi panggung (kaya boneka sing nyarang). Saben tataran bisa ngemot sawetara komponen - pemandangan, kang bisa ngalih ing antarane piyambak. Secara internal, iki dileksanakake dening grafik obyek sing disebut Scene Graph (ing ngendi saben unsur minangka simpul, uga disebut Node ).
  • Node minangka kontrol, kayata tombol label, utawa malah tata letak, sing bisa duwe macem-macem komponen nested ing njero. Saben pemandangan bisa duwe siji simpul nested, nanging bisa dadi tata letak karo sawetara komponen. Nesting bisa multi-level, kanthi tata letak sing ngemot tata letak liyane lan komponen biasa. Saben simpul kasebut duwe pengenal, gaya, efek, negara, lan panangan acara dhewe.
Pambuka Java FX - 4 Dadi ayo pindhah menyang kode. Awit aku nggunakake Java 8, aku ora perlu narik dependensi apa wae, amarga JavaFx ana ing JDK kanthi standar (kaya ing Java 9.10), nanging yen kita duwe Java 11+, mula kita kudu pindhah menyang repositori maven lan narik saka ana dependensi.

JavaFX: conto panggunaan

Kita nggawe kelas biasa kanthi metode main(titik entri):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Ing kene kelas kita warisan saka javafx.application.Application(sing kita duwe saka kothak Bugaga). Ing utama kita nelpon cara Aplikasi statis launch()kanggo mbukak jendhela kita. Uga, ide kita bakal sambat yen kita durung ngetrapake metode Aplikasi, startsing pungkasane ditindakake. Kanggo apa? Lan supaya bisa ngatur properti (fungsi saka jendhela kita). Kanggo nindakake iki, kita nggunakake argumen mlebu primaryStagesing diarani metode showsupaya kita bisa ndeleng jendhela sing diluncurake ing main. Ayo isi cara kita sethithik 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();
}
Dadi apa sing kita deleng ing kene? Ayo diterusake kanthi baris: 2 - nyetel jeneng jendhela dhewe (tataran) 3.4 - nyetel dimensi 6.7 - nyetel path stream maca menyang file (lambang) Pambuka Java FX - 58 - nggawe file minangka obyek Gambar, sing disambungake menyang file nyata dening stream liwati ing konstruktor 9 - nyetel lambang ing panel ndhuwur jendhela 11 - nggawe obyek tombol 13-16 - nyetel reaksi nalika tombol dipencet 17 - nggawe pemandangan ngendi kita nyelehake tombol kita 18 - nyeleh pemandangan ing jendhela umum kita 20 - nyetel gendera visibilitas kanggo jendhela Lan minangka asil kita njaluk jendhela cilik kanggo welcome pesels favorit kita: Pambuka Java FX - 6Kabeh katon luwih prasaja saka Swing, apa ora? Nanging durung rampung. Ora apik kanggo nulis kabeh kode kanggo nampilake aplikasi, sampeyan kudu dibagi piye wae supaya bisa dingerteni (komponen grafis ing siji basket, logika ing liyane). Lan ing kene xml mlebu ing gambar ... Ya ampun, xml? Persis. Khusus, kita nggunakake implementasine khusus kanggo JavaFX - FXML, ing ngendi kita nemtokake komponen grafis aplikasi lan sifate (kabeh ukuran, lan sapiturute), banjur nyambungake menyang pengontrol, sing mbantu ngatur logika. Ayo ndeleng conto xml iki:
<?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 - basa skrip sing digunakake 4-6 - data sing diimpor 8-9 Vbox - wadhah sing nyelehake subkomponen ing siji baris. 11 - nampilake sawetara teks 13 - tombol, nalika diklik, kita nggunakake cara sing diterangake ing script ing baris 15-18. Kudu ana kode kanggo nelpon file xml iki ing cara start, nanging saiki iki ora dadi penting, lan kita bakal ngilangi (ing ngisor iki bakal ana conto narik file iki). Dadi, xml, mesthi, apik (nanging ora apik banget), nulis kanthi manual banget mbingungake, apa ora iki abad pungkasan? Pambuka Java FX - 7

Ngenalake JavaFX SceneBuilder

Ing titik iki (drum roll) main - SceneBuilder Ing JavaFX Scene Builder minangka alat sing bisa digunakake kanggo ngrancang jendhela ing wangun antarmuka grafis lan banjur disimpen, lan program iki, adhedhasar asil, bakal mbangun file xml sing kita bakal nambah ing aplikasi kita. Antarmuka pembangun fmxl iki katon kaya iki: Pambuka Java FX - 8

A digression cilik. Pelajaran JavaFX

Aku bakal ngliwati rincian instalasi, lan sinau rinci babagan alat iki uga. Iki minangka topik sing kudu ditelusuri luwih lanjut. Mulane, aku isih bakal ninggalake sawetara pranala menarik kanggo pelajaran JavaFX: siji (tutorial online ing JavaFX) lan loro (tutorial apik liyane). Ayo dadi mbukak liwat conto sethitik aku sketsa metu. Ing pungkasan aku entuk kaya: Pambuka Java FX - 9
(kaya jendhela kanggo ndhaptar asu)
Nalika sampeyan milih asu banjur pencet tombol Busak, asu dibusak saka dhaftar kita. Nalika sampeyan milih kanca papat-legged lan ngganti lapangan, lan sawise mencet tombol Sunting, informasi asu dianyari. Nalika kita menet tombol Anyar, jendhela njedhul munggah kanggo nggawe rekaman kanggo asu anyar (kanggo miwiti karo jenenge): Pambuka Java FX - 10Banjur klik Simpen lan isi kolom liyane ing jendhela pisanan, banjur klik tombol Owahi kanggo nyimpen. Muni gampang, tengen? Ayo ndeleng carane iki bakal katon ing aplikasi Java. Kanggo miwiti, aku mung bakal ninggalake tata letak xml kanggo rong jendhela iki digawe ing SceneBuilder: First (dhasar):
<?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>
Kapindho (kanggo nggawe asu anyar):
<?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>
Apa struktur folder katon kaya: Pambuka Java FX - 11Nalika sampeyan bisa ndeleng, ora ana sing khusus, ana pengontrol sing makili windows tartamtu, ana model sing makili data kita. Ayo goleki kelas sing mbukak aplikasi (Implementasi 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));
    }
Ing kene kita ndeleng konstruktor sing bakal ngisi data awal (sing disimpen ing lembar khusus - 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();
}
Ora ana sing khusus - mainlan implementasine start()sing mbukak aplikasi kasebut:
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();
        }
    }
Dadi, ing kene kita ndeleng cara sing bener-bener diluncurake start(), yaiku, sing nyetel setelan jendhela dhasar. Kayata ing tata letak xml ing sumber daya: menehi lambang, ngubungake menyang pengontrol tartamtu, lan menehi pengontrol link menyang 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();
        }
    }
}
Ing kene kita bisa ndeleng cara sing tanggung jawab kanggo tampilan jendela kapindho - jendhela kanggo nggawe rekaman anyar (jeneng asu anyar). Kita uga nyetel controller, tata letak xml, panggung, lan liya-liyane ... Kelas sabanjure sing bakal kita nimbang bakal dadi model sing makili asu kita (informasi babagan iki): @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;
    }
}
Ing kene kita ndeleng loro konstruktor, siji meh biasa karo kabeh argumen (meh, amarga kita nggunakake wrapper FX khusus saka jinis prasaja) lan konstruktor tanpa bantahan: kita nggunakake nalika nggawe asu anyar, kang pisanan mung duwe jeneng. Controller kanggo jendhela dhasar: @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;
Ing kene kita ndeleng kolom obyek, nanging ing format TextField. Iki minangka format sing makili kolom input teks. @FXML minangka anotasi sing dirancang kanggo ngubungake kode Jawa lan obyek sing cocog karo tata letak kita (tombol, kolom, utawa liya-liyane).
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Ing kene kita ndeleng cara kanggo nampilake jeneng asu, ing sisih tengen ing dhaptar (anotasi @FXML sing ana gandhengane karo komponen tata letak 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("");
    }
}
Ing cara pisanan kita ndeleng nyetel referensi internal kanggo kelas sing ngleksanakake Aplikasi (supaya kita bisa nelpon cara kanggo nelpon jendhela kapindho), lan nyetel dhaftar dhisikan kanggo ditampilake. Kapindho mriksa apa asu saiki duwe data tartamtu, lan adhedhasar iki nyetel kolom 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);
        }
    }
}
Ing kene kita ndeleng telung cara jendhela dhasar sing ana gandhengane karo tombol: Pambuka Java FX - 12
  • mbusak - mbusak asu sing dipilih (dipilih) kanthi indeks;
  • edit - nggawe asu anyar karo data sing ditransfer, lan nyetel tinimbang sing sadurunge;
  • nggawe - kita nggawe asu anyar lan nelpon cara nelpon jendhela nggawe, maringaken obyek anyar, lan sawise nutup kang, yen jeneng ora null, banjur nyimpen pet anyar.
Ngalih, pengontrol jendhela kanggo nggawe asu: @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();
    }
}
Ing kene kita ndeleng sambungan karo kolom teks ing jendhela, ngolah tombol Simpen lan Batal, sing piye wae nutup jendhela. Nalika sampeyan bisa ndeleng, kanggo luwih penak ing aplikasi cilik, Aku nggunakake Lombok, yen kode bakal thukul banget, lan aku ora bakal pas menyang review sandi. Mungkin mung kuwi sing dakkarepake kanggo dina iki. Dina iki kita sedhela kenal karo konsep dhasar lan conto nggunakake JavaFX, lan kita bisa mbangun aplikasi desktop cilik (nggunakake informasi tambahan, sing, untunge, akeh banget ing Internet). Lan sampeyan, ing giliran, kaya))
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION