JavaRush /Java блогу /Random-KY /Java FX менен таанышуу
Константин
Деңгээл

Java FX менен таанышуу

Группада жарыяланган
Күндөрдүн биринде мен өзүмдүн керектөөлөрүм үчүн кичинекей рабочий тиркемени жазуу идеясы пайда болду - чет өлкөлүк сөздөрдү үйрөнүү үчүн кичинекей сөздүк сыяктуу бир нерсе - жана мен мээмди тырмалай баштадым, муну кантип кылмак элем? Албетте, менин оюма биринчи келген нерсе Свинг болду. Свинг жөнүндө ар бир адам уккандыр . Бул колдонуучу, графикалык интерфейстерди түзүү үчүн китепкана. Биздин сүйүктүү Oracle Свингден толук баш тарта электигине байланыштуу, ал эскирген деп эсептелбейт жана тиркемелер дагы эле ага иштейт. Бирок, ал мындан ары Swing тарабынан модернизацияланbyte жана Oracleдагы адамдар бизге JavaFXтин келечеги кандай болорун сезишти. Чындыгында, JavaFX Swing компоненттерин кызмат көрсөтүүчү катары колдонот)

JavaFX деген эмне?

JavaFX негизинен Java үчүн GUI инструменттери. Бул жерде бир аз чегинүү болот, жана биз GUI деген эмне экенин эстейбиз : Графикалык колдонуучу интерфейси - бул колдонуучу интерфейсинин бир түрү, анда бардык элементтер (баскычтар, менюлар, иконкалар, тизмелер) колдонуучуга сунушталат. дисплей сүрөт, графика түрүндө жасалат. Буйрук сабынын интерфейсинен айырмаланып, GUIде колдонуучу киргизүү түзүлүштөрү аркылуу көрүнгөн an objectтерге туш келди кире алат. Көбүнчө интерфейстин элементтери метафоралар түрүндө ишке ашырылып, колдонуучуга түшүнүүнү жеңилдетүү үчүн алардын касиеттерин жана максатын көрсөтөт. JavaFX Java тorнде оюндарды жана рабочий тиркемелерди түзүүгө багытталган. Чынында, ал Java үчүн сунушталган жаңы GUI куралынан улам Swingди алмаштырат. Ошондой эле, ал бизге GUI макет файлдарын (XML) стorн түзүүгө жана веб-тиркемелерде көнүп калгандай CSS аркылуу аларды көрктүү кылууга мүмкүндүк берет. JavaFX кошумча интегралдык 3D графикасын, ошондой эле аудио, видео жана камтылган тармактык тиркемелерди бирдиктүү GUI инструменттеринин топтомун иштетет... Аны үйрөнүү оңой жана жакшы оптималдаштырылган. Ал көптөгөн операциялык системаларды, ошондой эле Windows, UNIX системаларын жана Mac OSти колдойт. Java FXге киришүү - 3

JavaFX өзгөчөлүктөрү:

  • JavaFX алгач ар кандай баскычтар, текст талаалары, tableлар, дарактар, менюлар, диаграммалар ж.
  • JavaFX көбүнчө CSS стилдерин колдонот жана биз аны Java codeунда эмес, GUI түзүү үчүн атайын FXML форматын колдоно алабыз. Бул көп убакыт бою Java codeу менен ойнобостон GUIди тез түзүүнү же көрүнүшүн же курамын өзгөртүүнү жеңилдетет.
  • JavaFX колдонууга даяр диаграмма бөлүктөрү бар, андыктан биз аларды нөлдөн баштап, сизге негизги диаграмма керек болгон учурда жазууга туура келбейт.
  • JavaFX кошумча түрдө 3D графикалык колдоо менен келет, эгерде биз кандайдыр бир оюнду же окшош тиркемелерди иштеп чыгууда көбүнчө пайдалуу болот.
Келгиле, биздин терезенин негизги компоненттерин бир аз карап көрөлү:
  • Этап - бул баштапкы кенептин ролун аткарган жана калган компоненттерди камтыган курчап турган терезе. Тиркемеде бир нече этап болушу мүмкүн, бирок кандай болгон күндө да ушундай бир компонент болушу керек. Негизи, этап негизги контейнер жана кирүү чекити болуп саналат.
  • Сахна - сахнанын мазмунун көрсөтөт (уя салган куурчак сыяктуу). Ар бир этап бир нече компоненттерди камтышы мүмкүн - өз ара алмаштырылышы мүмкүн болгон көрүнүш. Ички, бул көрүнүш графиги деп аталган an object графиги тарабынан ишке ашырылат (мында ар бир элемент түйүн болуп саналат, ошондой эле Node деп аталат ).
  • Түйүндөр - бул энбелги баскычтары, атүгүл макеттер сыяктуу башкаруу элементтери, алардын ичинде бир нече уяланган компоненттер болушу мүмкүн. Ар бир сахнада бир уя түйүн болушу мүмкүн, бирок ал бир нече компоненттерден турган макет болушу мүмкүн. Уя салуу көп деңгээлдүү болушу мүмкүн, макеттер башка макеттерди жана кадимки компоненттерди камтыган. Мындай түйүндөрдүн ар биринин өзүнүн идентификатору, стor, эффекттери, абалы жана окуяны иштетүүчүлөрү бар.
Java FXге киришүү - 4 Келгиле, codeго бир аз жылалы. Мен Java 8ди колдонгондуктан, эч кандай көз карандылыкты көтөрүүнүн кереги жок, анткени JavaFx демейки боюнча JDKде (Java 9.10 сыяктуу), бирок бизде Java 11+ болсо, анда биз maven репозиторийине барышыбыз керек жана аны ошол жерден көз карандылыктан тартыңыз.

JavaFX: колдонуу мисалдары

Биз кадимки классты метод менен түзөбүз main(кирүү чекити):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
javafx.application.ApplicationБул жерде биздин класс (биз Бугага кутусунан) мураска алат . Негизинен биз launch()терезебизди ишке киргизүү үчүн статикалык Колдонмо ыкмасын чакырабыз. Ошондой эле, биздин идеябыз Колдонмо ыкмасын ишке ашыра элекпиз деп нааразы болот, startмуну биз акыры жасайбыз. Бул эмне үчүн? Жана касиеттерди (биздин терезенин функционалдуулугу) башкара алуу үчүн. Бул үчүн, биз кирүүчү аргументти колдонобуз primaryStage, аны биз метод деп атайбыз show, андыктан терезе ачылып жатканын көрө алабыз main. Келгиле, биздин ыкманы бир аз толтуруп көрөлү 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();
}
Анда биз бул жерден эмнени көрүп жатабыз? Аны сап-сап аркылуу карап көрөлү: 2 - терезенин атын коюу (этап) 3.4 - анын өлчөмдөрүн коюу 6.7 - окуу агымынын файлга жолун коюу (иконка) Java FXге киришүү - 58 - файлды Image an objectиси катары түзүү, конструктордо өткөн агым аркылуу чыныгы файлга туташтырылган 9 - терезенин үстүнкү панелине белги коюу биз 18 баскычыбызды жайгаштырабыз - көрүнүштү жалпы терезебизге жайгаштырабыз 20 - терезеге көрүнүү желегин орнотобуз жана натыйжада биз сүйүктүү песелдерди тосуп алуу үчүн кичинекей терезеге ээ болобуз: Java FXге киришүү - 6Свингге караганда баары жөнөкөй көрүнөт, туурабы? Бирок али бүтө элек. Тиркемени көрсөтүү үчүн бардык codeду жазуу жакшы эмес, аны түшүнүктүү кылуу үчүн аны кандайдыр бир жол менен бөлүү керек (бир себеттеги графикалык компоненттер, экинчисинде логика). Жана бул жерде xml сүрөткө кирет ... Оо кудай, xml? Так. Тактап айтканда, биз аны JavaFX - FXML үчүн атайын ишке киргизебиз, анда биз колдонмонун графикалык компоненттерин жана алардын касиеттерин (бардык өлчөмдөр, ж.б.) аныктап, андан кийин логиканы башкарууга жардам берген контроллерге туташтырабыз. Бул xml мисалын карап көрөлү:
<?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 - биз колдонгон скрипт тor 4-6 - импорттолгон маалыматтар 8-9 Vbox - субкомпоненттерди бир сапка жайгаштырган контейнер. 11 - кээ бир текстти көрсөтүү 13 - баскыч, басылганда, биз 15-18-саптардагы скриптте сүрөттөлгөн ыкманы колдонобуз. Методдо бул xml файлын чакыруу үчүн code болушу керек start, бирок азыр бул анчалык деле маанилүү эмес жана биз аны өткөрүп жиберет (төмөндө бул файлды тартуунун мисалы болот). Ошентип, xml, албетте, жакшы (бирок өтө жакшы эмес), аларды кол менен жазуу абдан чаташып турат, бул өткөн кылым эмеспи? Java FXге киришүү - 7

JavaFX SceneBuilder менен тааныштыруу

Дал ушул учурда (барабан ролу) ишке кирет - SceneBuilder JavaFX-те Scene Builder бул курал, анын жардамы менен биз терезелерибизди графикалык интерфейс түрүндө долбоорлоп, анан аларды сактай алабыз жана бул программа натыйжанын негизинде xml файлдарын түзүңүз, биз аны колдонмобузда жакшыртабыз. Бул fmxl куруучунун интерфейси төмөнкүдөй көрүнөт: Java FXге киришүү - 8

Кичинекей четтөө. JavaFX сабактары

Мен орнотуу чоо-жайын, ошондой эле бул куралды деталдуу изилдөөнү өткөрүп жиберем. Булар дагы изилдөөгө арзырлык темалар. Ошондуктан, мен дагы эле JavaFX сабактарына бир нече кызыктуу шилтемелерди калтырам: бири (JavaFX боюнча онлайн окуу куралы) жана экөө (дагы бир жакшы окуу куралы). Келгиле, мен жазган кичинекей мисалды карап көрөлү. Акыр-аягы, мен бир нерсе алдым: Java FXге киришүү - 9
(иттерди каттоо үчүн терезе сыяктуу)
Сиз итти тандап, Өчүрүү баскычын бассаңыз, ит биздин тизмеден чыгарылат. Төрт буттуу досуңузду тандап, анын талааларын өзгөрткөнүңүздө жана Түзөтүү баскычын басканда иттин маалыматы жаңыланат. Жаңы баскычты басканда, жаңы ит үчүн жазуу түзүү үчүн терезе пайда болот (анын аты менен баштоо үчүн): Java FXге киришүү - 10Андан кийин Сактоо баскычын чыкылдатып, биринчи терезеде анын калган талааларын толтуруңуз, андан кийин Түзөтүү баскычын басыңыз. сактоо. Оңой угулат, туурабы? Бул биздин Java тиркемесинде кандай болорун карап көрөлү. Баштоо үчүн, мен бул жерде түзүлгөн бул эки терезе үчүн xml макеттерин калтырам SceneBuilder: Биринчи (негизги):
<?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>
Экинчи (жаңы иттерди түзүү үчүн):
<?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>
Папканын структурасы кандай көрүнөт: Java FXге киришүү - 11Көрүнүп тургандай, өзгөчө эч нерсе жок, кээ бир терезелерди чагылдырган контроллерлор бар, биздин маалыматтарды чагылдырган моделдер бар. Келгиле, тиркемени ишке киргизген классты карап көрөлү (Колдонмону ишке ашыруу): @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));
    }
Бул жерде биз баштапкы маалыматтарыбызды толтуруучу конструкторду көрөбүз (аны биз атайын баракта сактайбыз - 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();
}
Өзгөчө эч нерсе жок - mainжана start()колдонмону ишке киргизүү:
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();
        }
    }
Ошентип, бул жерде биз чындыгында ишке киргизген ыкманы start(), тактап айтканда, биздин базалык терезебиздин жөндөөлөрүн орноткон ыкманы көрөбүз. Ресурстардагы xml макетиндегидей: ага сөлөкөт берүү, аны белгилүү бир контроллерге байланыштыруу жана контроллерге класска шилтеме берүү 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();
        }
    }
}
Бул жерде биз экинчи терезенин пайда болушу үчүн жооптуу болгон ыкманы көрөбүз - жаңы жазууну түзүү терезеси (жаңы иттин аты). Биз ошондой эле контроллерди, xml макетти, сахнаны ж.б. орнотобуз... Кийинки класс биздин итибизди көрсөткөн модель болот (ал жөнүндө маалымат): @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;
    }
}
Бул жерде биз эки конструкторду көрүп жатабыз.Бири дээрлик бардык аргументтери бар кадимки конструктор (дээрлик, анткени биз жөнөкөй типтеги атайын FX орогучтарын колдонобуз) жана аргументи жок конструктор: биз аны жаңы итти түзүүдө колдонобуз, анын башында бир гана бар. аты. Негизги терезе үчүн контроллер: @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;
Бул жерде биз an object талааларыбызды көрөбүз, бирок TextField форматында. Бул текст киргизүү талаасын билдирген формат. @FXML - бул Java codeун жана биздин макеттин тиешелүү an objectисин (баскыч, талаа же башка нерсе) байланыштырууга арналган annotation.
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Бул жерде биз тизменин оң жагында ит атын көрсөтүү ыкмасын көрөбүз (анын @FXML annotationсы 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("");
    }
}
Биринчи ыкмада биз Колдонмону ишке ашырган класска ички шилтеме коюуну (биз анын ыкмасын экинчи терезеге чакыруу үчүн чакыра алабыз) жана көрсөтүлө турган баштапкы тизмени орнотууну көрөбүз. Экинчиси учурдагы иттин белгилүү бир маалыматтары бар-жоктугун текшерет жана анын негизинде текст талааларын белгилейт:
@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);
        }
    }
}
Бул жерде биз баскычтар менен байланышкан базалык терезенин үч ыкмасын көрөбүз: Java FXге киришүү - 12
  • өчүрүү — тандалган (тандалган) итти индекс боюнча өчүрүү;
  • түзөтүү - өткөрүлүп берилген маалыматтар менен жаңы ит түзүү жана аны мурункунун ордуна коюу;
  • түзүү - биз жаңы ит түзөбүз жана түзүү терезесин чакыруу ыкмасын чакырып, жаңы an objectти өткөрүп, аны жапкандан кийин, аты нөл эмес болсо, анда жаңы үй жаныбарын сактап калабыз.
Улантуу, итти түзүү үчүн терезе контроллери: @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();
    }
}
Бул жерде биз терезени кандайдыр бир жол менен жаап турган Сактоо жана Жокко чыгаруу баскычтарын иштетип, терезедеги текст талаасы менен байланышты көрөбүз. Көрүнүп тургандай, кичинекей колдонмомдо көбүрөөк ыңгайлуулук үчүн мен Ломбокту колдондум, антпесе code абдан чоңоймок жана мен аны карап чыгууга туура келбейт элем. Бүгүнкү күндө менде болгону ушул болсо керек. Бүгүн биз кыскача негизги түшүнүктөр жана JavaFX колдонуунун үлгүсү менен таанышып чыктык жана биз кичинекей рабочий тиркемелерди түзө алабыз (кошумча маалыматты колдонуу менен, бактыга жараша, Интернетте көп). А сиз болсо өз кезегинде жактырасыз))
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION