JavaRush /Блоги Java /Random-TG /Муқаддима ба Java FX

Муқаддима ба Java FX

Дар гурӯҳ нашр шудааст
Як рӯз ман фикр кардам, ки як замимаи хурди мизи корӣ барои эҳтиёҷоти худ нависам - чизе монанди луғати хурд барои омӯзиши калимаҳои хориҷӣ - ва ман ба майнаам сар кардам, чӣ гуна метавонам ин корро кунам? Табиист, ки аввалин чизе, ки ба сари ман омад, Свинг буд. Эҳтимол ҳама дар бораи Свинг шунидаанд . Ин китобхона барои эҷоди интерфейсҳои корбар ва графикӣ мебошад. Аз сабаби он, ки Oracle-и маҳбуби мо ҳанӯз аз Swing комилан даст накашидааст, он кӯҳна ҳисобида намешавад ва барномаҳо то ҳол дар он кор мекунанд. Аммо, он дигар аз ҷониби Swing навсозӣ карда намешавад ва одамон дар Oracle ба мо чашидаанд, ки ояндаи JavaFX чист. Ва дар асл, JavaFX ҷузъҳои Swing-ро ҳамчун провайдери хидматрасон истифода мебарад)

JavaFX чист?

JavaFX аслан як абзори GUI барои Java мебошад. Дар ин ҷо як паҳлӯи хурде хоҳад буд ва мо дар хотир хоҳем дошт, ки GUI чист : Интерфейси графикии корбар - интерфейси графикии корбар як намуди интерфейси корбар аст, ки дар он ҳама унсурҳо (тугмаҳо, менюҳо, нишонаҳо, рӯйхатҳо) ба корбар дар экран пешниҳод карда мешаванд. намоиш дар шакли расмхо, графикхо сохта мешаванд. Баръакси интерфейси сатри фармон, дар GUI корбар дастрасии тасодуфӣ ба an objectҳои намоён бо истифода аз дастгоҳҳои вуруд дорад. Аксар вақт, унсурҳои интерфейс дар шакли метафораҳо амалӣ карда мешаванд ва хосиятҳо ва ҳадафҳои онҳоро барои осон кардани фаҳмиши корбар нишон медиҳанд. JavaFX барои эҷоди бозиҳо ва барномаҳои мизи корӣ дар Java нигаронида шудааст. Дарвоқеъ, он Swing-ро аз ҳисоби асбоби нави GUI барои Java иваз мекунад. Ғайр аз он, он ба мо имкон медиҳад, ки файлҳои тарҳбандии GUI (XML) -ро тарҳрезӣ кунем ва онҳоро бо истифода аз CSS зеботар созем, ба он чизе ки мо дар барномаҳои веб одат кардаем. JavaFX ба таври илова графикаи ҳамгирошудаи 3D, инчунин аудио, видео ва замимаҳои шабакавии дарунсохтро дар як абзори GUI идора мекунад... Инро омӯхтан осон ва хуб оптимизатсия карда мешавад. Он бисёр системаҳои оператсионӣ, инчунин Windows, системаҳои UNIX ва Mac OS -ро дастгирӣ мекунад. Муқаддима ба Java FX - 3

Хусусиятҳои JavaFX:

  • JavaFX дар аввал бо маҷмӯи васеи қисмҳои интерфейси графикӣ, аз қабor ҳама гуна тугмаҳо, майдонҳои матнӣ, ҷадвалҳо, дарахтҳо, менюҳо, диаграммаҳо ва ғайра меояд, ки дар навбати худ вақти зиёдро сарфа мекунад.
  • JavaFX аксар вақт услубҳои CSS-ро истифода мебарад ва мо метавонем формати махсуси FXML-ро барои сохтани GUI истифода барем, на ин ки онро дар codeи Java иҷро кунем. Ин имкон медиҳад, ки зуд тарҳрезии GUI ё тағир додани намуди зоҳирӣ ё таркибро бидуни бозӣ кардан бо рамзи Java барои муддати тӯлонӣ осон кунад.
  • JavaFX дорои қисмҳои диаграммаи барои истифода омода аст, аз ин рӯ ба мо лозим нест, ки ҳар вақте, ки ба шумо диаграммаи асосӣ лозим аст, онҳоро аз сифр нависем.
  • JavaFX ба таври илова бо дастгирии графикаи 3D меояд, ки аксар вақт муфид аст, агар мо ягон намуди бозӣ ё барномаҳои шабеҳро таҳия кунем.
Биёед ба ҷузъҳои асосии равзанаи худ каме назар андозем:
  • Марҳила аслан равзанаи атрофест, ки ҳамчун рони ибтидоӣ амал мекунад ва ҷузъҳои боқимондаро дар бар мегирад. Ариза метавонад якчанд марҳила дошта бошад, аммо дар ҳар сурат бояд як чунин ҷузъ мавҷуд бошад. Аслан, Stage контейнери асосӣ ва нуқтаи вуруд аст.
  • Саҳна - мундариҷаи саҳнаро нишон медиҳад (ба монанди лӯхтаки лона). Ҳар як марҳила метавонад якчанд ҷузъҳоро дар бар гирад - саҳна, ки онҳоро байни худ иваз кардан мумкин аст. Дар дохor он, ин тавассути графикаи an objectи бо номи Scene Graph амалӣ карда мешавад (дар он ҷо ҳар як элемент гиреҳ аст, ки онро 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(ки мо аз қуттии Bugaga дорем) мерос мегирад. Дар асл, мо усули статикии Аризаро 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 - файлро ҳамчун an objectи тасвир эҷод кунед, ки ба файли воќеї тавассути љараёне, ки дар конструктор гузаронида мешавад, пайваст карда мешавад 9 - дар панели болоии равзана нишона гузоред 11 - an objectи тугмачаро созед 13-16 - реаксияро њангоми пахш кардани тугма танзим кунед 17 - сањнае созед, ки дар он мо тугмаи 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 - забони скрипт, ки мо истифода мебарем 4-6 - додаҳои воридотӣ 8-9 Vbox - контейнер, ки зеркомпонентҳоро дар як сатр ҷойгир мекунад. 11 - намоиши баъзе матн 13 - тугма, вақте ки пахш карда мешавад, мо усули дар скрипт дар сатрҳои 15-18 тавсифшударо истифода мебарем.Дар метод бояд codeи занги ин файли xml мавҷуд бошад 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 эзоҳест, ки барои пайваст кардани codeи Java ва an objectи мувофиқи тарҳбандии мо (тугма, майдон ё чизи дигар) пешбинӣ шудааст.
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Дар ин ҷо мо усули намоиши номҳои сагро дар тарафи рости рӯйхат мебинем (annotationи @FXML ба ҷузъи тарҳбандии 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("");
    }
}
Дар усули аввал мо мебинем, ки истинодҳои дохorро ба синфе, ки Аризаро амалӣ мекунад (то он ки мо метавонем усули онро барои занги равзанаи дуюм даъват кунем) ва гузоштани рӯйхати ибтидоиро барои намоиш дода шавад. Дуюм месанҷад, ки саги ҷорӣ дорои маълумоти муайян аст ва дар асоси ин майдонҳои матнро муқаррар мекунад:
@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();
    }
}
Дар ин ҷо мо алоқаро бо майдони матн дар равзана мебинем, ки тугмаҳои Захира ва Бекорро коркард мекунанд, ки бо ягон роҳ равзанаро мепӯшанд. Тавре ки шумо мебинед, барои роҳати бештар дар замимаи хурди худ, ман Lombok -ро истифода кардам, вагарна code хеле калон мешуд ва ман онро ба баррасии худ мувофиқат намекардам. Шояд ин ҳама чизест, ки ман имрӯз дорам. Имрӯз мо ба таври мухтасар бо мафҳумҳои асосӣ ва намунаи истифодаи JavaFX шинос шудем ва мо метавонем барномаҳои хурди мизи корӣ (бо истифода аз маълумоти иловагӣ, ки хушбахтона, дар Интернет фаровон аст) созем. Ва шумо, дар навбати худ, маъқул аст))
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION