JavaRush /Java Blogu /Random-AZ /Java FX-ə giriş

Java FX-ə giriş

Qrupda dərc edilmişdir
Bir gün ehtiyaclarım üçün kiçik bir iş masası proqramı yazmaq fikrim var idi - xarici sözləri öyrənmək üçün kiçik bir lüğət kimi bir şey - və beynimi parçalamağa başladım, bunu necə edə bilərdim? Təbii ki, ağlıma ilk gələn Swing oldu. Yəqin ki, hər kəs Swing haqqında eşitmişdir . Bu istifadəçi, qrafik interfeyslər yaratmaq üçün kitabxanadır. Bizim sevimli Oracle Swing-dən hələ tam imtina etmədiyinə görə, o, köhnəlmiş hesab edilmir və tətbiqlər hələ də onun üzərində işləyir. Bununla belə, o, artıq Swing tərəfindən modernləşdirilmir və Oracle-dakı insanlar bizə JavaFX-in gələcəyinin dadını verdilər. Və əslində JavaFX Swing komponentlərindən xidmət təminatçısı kimi istifadə edir)

JavaFX nədir?

JavaFX mahiyyətcə Java üçün GUI alət dəstidir. Burada kiçik bir təxribat olacaq və biz GUI-nin nə olduğunu xatırlayacağıq : Qrafik istifadəçi interfeysi - qrafik istifadəçi interfeysi bütün elementlərin (düymələr, menyular, nişanlar, siyahılar) istifadəçiyə təqdim etdiyi istifadəçi interfeysinin bir növüdür. displey şəkillər, qrafika şəklində hazırlanır. Komanda xətti interfeysindən fərqli olaraq, GUI-də istifadəçi giriş cihazlarından istifadə edərək görünən obyektlərə təsadüfi giriş əldə edir. Çox vaxt interfeys elementləri metaforalar şəklində həyata keçirilir və istifadəçinin başa düşülməsini asanlaşdırmaq üçün onların xüsusiyyətlərini və məqsədini göstərir. JavaFX Java-da oyunlar və masaüstü proqramlar yaratmaq məqsədi daşıyır. Əslində, Java üçün təklif olunan yeni GUI alətinə görə Swing-i əvəz edəcək. Bundan əlavə, o, bizə GUI tərtibat fayllarını (XML) tərtib etməyə və veb proqramlarında istifadə etdiyimiz kimi CSS-dən istifadə edərək onları daha zərif etməyə imkan verir. JavaFX əlavə olaraq vahid GUI alət dəstində inteqrasiya olunmuş 3D qrafika, eləcə də audio, video və quraşdırılmış şəbəkə proqramlarını idarə edir... Onu öyrənmək asandır və yaxşı optimallaşdırılmışdır. O, bir çox əməliyyat sistemini, həmçinin Windows, UNIX sistemlərini və Mac OS-ni dəstəkləyir. Java FX-ə giriş - 3

JavaFX Xüsusiyyətləri:

  • JavaFX əvvəlcə hər cür düymələr, mətn sahələri, cədvəllər, ağaclar, menyular, diaqramlar və s. kimi qrafik interfeys hissələrinin böyük dəsti ilə gəlir ki, bu da öz növbəsində bizə çox vaxt qənaət edəcəkdir.
  • JavaFX tez-tez CSS üslublarından istifadə edir və biz GUI yaratmaq üçün Java kodunda deyil, xüsusi FXML formatından istifadə edə biləcəyik. Bu, uzun müddət Java kodu ilə oynamadan GUI-ni tez bir zamanda tərtib etməyi və ya görünüşü və ya kompozisiyanı dəyişdirməyi asanlaşdırır.
  • JavaFX istifadəyə hazır diaqram hissələrinə malikdir, ona görə də əsas diaqrama ehtiyacınız olduqda onları sıfırdan yazmağa məcbur deyilik.
  • JavaFX əlavə olaraq 3D qrafika dəstəyi ilə gəlir ki, bu da bir növ oyun və ya oxşar proqramlar hazırlayarkən çox vaxt faydalıdır.
Pəncərəmizin əsas komponentlərinə bir az nəzər salaq:
  • Mərhələ əslində başlanğıc kətan rolunu oynayan və qalan komponentləri ehtiva edən ətraf pəncərədir. Tətbiq bir neçə mərhələdən ibarət ola bilər, lakin hər halda bir belə komponent olmalıdır. Əslində, Mərhələ əsas konteyner və giriş nöqtəsidir.
  • Səhnə - səhnənin məzmununu göstərir (yuva quran kukla kimi). Hər bir mərhələdə bir neçə komponent ola bilər - səhnə, öz aralarında dəyişdirilə bilər. Daxili olaraq, bu, Səhnə Qrafiki adlanan obyekt qrafiki ilə həyata keçirilir (burada hər bir element bir qovşaqdır, həmçinin Node adlanır ).
  • Qovşaqlar , etiket düymələri və ya hətta onların içərisində çoxlu iç-içə komponentlərə malik ola bilən planlar kimi idarəetmə elementləridir. Hər bir səhnədə bir iç-içə qovşaq ola bilər, lakin bu, bir neçə komponentdən ibarət tərtibat ola bilər. Yerləşdirmə çoxsəviyyəli ola bilər, planlar digər planları və müntəzəm komponentləri ehtiva edir. Hər bir belə node öz identifikatoru, üslubu, effektləri, vəziyyəti və hadisə idarəedicilərinə malikdir.
Java FX-ə giriş - 4 Beləliklə, koda doğru bir az hərəkət edək. Java 8-dən istifadə etdiyim üçün heç bir asılılığı götürməyə ehtiyac duymuram, çünki JavaFx standart olaraq JDK-dadır (Java 9.10-da olduğu kimi), lakin əgər bizdə Java 11+ varsa, o zaman maven deposuna getməliyik və onu oradan asılılıqlardan çıxarın.

JavaFX: istifadə nümunələri

Bir metodla main(giriş nöqtəsi) adi sinif yaradırıq:
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Burada sinifimiz miras alır javafx.application.Application(bu, Buqaqa qutusundan bizdə var). launch()Əsas olaraq pəncərəmizi işə salmaq üçün statik Tətbiq metodunu çağırırıq . Həmçinin, fikrimiz Tətbiq metodunu tətbiq etmədiyimizdən şikayət edəcək, startnəticədə etdiyimiz budur. Bu nə üçündür? Və xassələri idarə edə bilmək üçün (pəncərəmizin funksionallığı). Bunun üçün primaryStagemetodu çağırdığımız daxil olan arqumentdən istifadə edirik showki, pəncərənin işə salındığını görə bilək main. Metodumuzu bir az dolduraq 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();
}
Bəs biz burada nə görürük? Gəlin onu sətir-sətir keçirək: 2 - pəncərənin özünün adını təyin edin (mərhələ) 3.4 - onun ölçülərini təyin edin 6.7 - oxuma axınının fayla yolunu təyin edin (ikona) Java FX-ə giriş - 58 - faylı Şəkil obyekti kimi yaradın, konstruktorda ötürülən axın vasitəsilə real fayla qoşulan 9 - pəncərənin yuxarı panelində ikona təyin etmək 11 - düymə obyekti yaratmaq 13-16 - düyməni basdıqda reaksiyanı təyin etmək 17 - burada səhnə yaratmaq biz düyməmizi 18 yerləşdiririk - səhnəni ümumi pəncərəmizə yerləşdirin 20 - pəncərə üçün görünmə bayrağını təyin edirik və nəticədə sevimli pesellerimizi qarşılamaq üçün kiçik bir pəncərə alırıq: Java FX-ə giriş - 6Hər şey Swing-dən daha sadə görünür, elə deyilmi? Amma hələ bitməyib. Tətbiqi göstərmək üçün bütün kodu yazmaq yaxşı deyil, onu daha başa düşülən etmək üçün onu bir şəkildə bölmək lazımdır (bir səbətdə qrafik komponentlər, digərində məntiq). Və burada xml şəkilə gəlir... Aman Allahım, xml? Tam olaraq. Xüsusilə, biz onun JavaFX - FXML üçün xüsusi tətbiqindən istifadə edirik, burada tətbiqin qrafik komponentlərini və onların xassələrini (hər cür ölçülər və s.) müəyyənləşdiririk və sonra onu məntiqi idarə etməyə kömək edən nəzarətçiyə qoşuruq. Bu xml nümunəsinə baxaq:
<?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 - istifadə etdiyimiz skript dili 4-6 - idxal edilmiş məlumatlar 8-9 Vbox - alt komponentləri bir sətirdə yerləşdirən konteyner. 11 - bəzi mətni göstərin 13 - düyməni basdıqda biz 15-18-ci sətirlərdə skriptdə təsvir olunan metoddan istifadə edirik Metodda bu xml faylını çağırmaq üçün kod olmalıdır, startlakin indi bu o qədər də vacib deyil və biz onu buraxacaq (aşağıda bu faylın çəkilməsi nümunəsi olacaq). Beləliklə, xml, əlbəttə ki, yaxşıdır (lakin çox yaxşı deyil), onları əl ilə yazmaq çox qarışıqdır, bu ötən əsr deyilmi? Java FX-ə giriş - 7

JavaFX SceneBuilder təqdim edirik

Məhz bu məqamda (baraban rulonu) işə düşür - SceneBuilder JavaFX-də Scene Builder, pəncərələrimizi qrafik interfeys şəklində dizayn edə və sonra onları saxlaya biləcəyimiz bir vasitədir və bu proqram nəticəyə əsaslanaraq, xml faylları yaradın ki, biz onu tətbiqimizdə təkmilləşdirəcəyik. Bu fmxl qurucusunun interfeysi belə görünür: Java FX-ə giriş - 8

Kiçik bir sapma. JavaFX dərsləri

Quraşdırma təfərrüatlarını və bu alətin ətraflı öyrənilməsini də atlayacağam. Bunlar daha çox araşdırmağa dəyər mövzulardır. Buna görə də, mən hələ də JavaFX dərslərinə bir neçə maraqlı keçid buraxacağam: biri (JavaFX üzrə onlayn dərslik) və ikisi (başqa bir yaxşı dərslik). Eskiz etdiyim kiçik bir nümunəni nəzərdən keçirək. Sonda belə bir şey aldım: Java FX-ə giriş - 9
(bir növ itlərin qeydiyyatı üçün pəncərə kimi)
Siz iti seçib Sil düyməsini sıxdığınız zaman it siyahımızdan silinir. Dörd ayaqlı dost seçib onun sahələrini dəyişdikdə və Redaktə düyməsini basdıqdan sonra itin məlumatları yenilənir. Yeni düyməsini basdığımız zaman yeni it üçün qeyd yaratmaq üçün pəncərə açılır (adından başlamaq üçün): Java FX-ə giriş - 10Sonra Saxla düyməsini basın və birinci pəncərədə onun qalan sahələrini doldurun və sonra Redaktə düyməsini sıxın. yadda saxla. Asan səslənir, elə deyilmi? Bunun Java tətbiqimizdə necə görünəcəyini görək. Başlamaq üçün, burada yaradılan bu iki pəncərə üçün xml tərtibatlarını buraxacağam SceneBuilder: Birinci (əsas):
<?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>
İkinci (yeni itlər yaratmaq üçün):
<?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>
Qovluq strukturu necə görünür: Java FX-ə giriş - 11Gördüyünüz kimi, xüsusi bir şey yoxdur, müəyyən pəncərələri təmsil edən kontrollerlər var, məlumatlarımızı təmsil edən modellər var. Tətbiqi işə salan sinfə nəzər salaq (Tətbiq tətbiqi): @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));
    }
Burada ilkin məlumatlarımızı dolduracaq konstruktoru görürük (biz bunu xüsusi vərəqdə saxlayırıq - 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();
}
Xüsusi bir şey yoxdur - mainstart()tətbiqi işə salan tətbiq:
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();
        }
    }
Beləliklə, burada biz əslində işə saldığımız metodu start(), yəni əsas pəncərəmizin parametrlərini təyin edən metodu görürük. Resurslardakı xml tərtibatında olduğu kimi: ona bir simvol vermək, onu xüsusi bir nəzarətçi ilə əlaqələndirmək və nəzarətçiyə sinifə keçid vermək this)
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();
        }
    }
}
Burada ikinci pəncərənin görünüşündən məsul olan üsulu görürük - yeni bir qeyd yaratmaq üçün pəncərə (yeni itin adı). Biz həmçinin nəzarətçi, xml layout, səhnə və s. təyin edirik... Növbəti nəzərdən keçirəcəyimiz sinif itimizi təmsil edən model olacaq (bu barədə məlumat): @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;
    }
}
Burada biz iki konstruktor görürük.Biri demək olar ki, bütün arqumentləri olan adi konstruktordur (demək olar ki, biz sadə tipli xüsusi FX sarğılarından istifadə edirik) və arqumentləri olmayan konstruktordur: biz ondan əvvəlcə yalnız bir iti olan yeni it yaradarkən istifadə edirik. ad. Əsas pəncərə üçün nəzarətçi: @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;
Burada biz obyekt sahələrimizi görürük, lakin TextField formatında. Bu mətn daxiletmə sahəsini təmsil edən formatdır. @FXML Java kodunu və tərtibatımızın müvafiq obyektini (düymə, sahə və ya başqa bir şey) əlaqələndirmək üçün nəzərdə tutulmuş annotasiyadır.
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Burada siyahıda sağda it adlarını göstərmək üçün bir üsul görürük (onun @FXML annotasiyası JavaFX TableView layout komponentinə bağlanır).
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("");
    }
}
Birinci üsulda biz Tətbiqi həyata keçirən sinifə daxili istinad təyin edilməsini görürük (biz onun metodunu ikinci pəncərəyə zəng etmək üçün çağıra bilək) və göstəriləcək ilkin siyahını təyin edirik. İkincisi, cari itin müəyyən məlumatlara malik olub olmadığını yoxlayır və bunun əsasında mətn sahələrini təyin edir:
@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);
        }
    }
}
Burada düymələrlə əlaqəli əsas pəncərənin üç üsulunu görürük: Java FX-ə giriş - 12
  • sil — seçilmiş (seçilmiş) iti indekslə silin;
  • redaktə et - ötürülən məlumatlarla yeni bir it yaradın və onu əvvəlkinin yerinə təyin edin;
  • yaratmaq - yeni bir it yaradırıq və yaratma pəncərəsini çağırmaq, yeni bir obyekt ötürmək və bağladıqdan sonra ad sıfır deyilsə, yeni ev heyvanını saxlamaq metodunu çağırırıq.
Davam edərək, it yaratmaq üçün pəncərə nəzarətçisi: @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();
    }
}
Burada pəncərəni birtəhər bağlayan Saxla və Ləğv düymələrini emal edən pəncərədəki mətn sahəsi ilə əlaqəni görürük. Gördüyünüz kimi, kiçik tətbiqimdə daha çox rahatlıq üçün Lombok-dan istifadə etdim, əks halda kod çox böyüyəcəkdi və mən onu nəzərdən keçirməyə sığışdırmazdım. Yəqin ki, bu gün üçün əlimdə olan şey budur. Bu gün biz qısaca əsas anlayışlar və JavaFX-dən istifadə nümunəsi ilə tanış olduq və kiçik masa üstü proqramlar qura bilərik (xoşbəxtlikdən İnternetdə bol olan əlavə məlumatlardan istifadə etməklə). Siz də öz növbənizdə bəyənirsiniz))
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION