JavaRush /Java-Blog /Random-DE /Einführung in Java FX

Einführung in Java FX

Veröffentlicht in der Gruppe Random-DE
Eines Tages hatte ich die Idee, eine kleine Desktop-Anwendung für meine Bedürfnisse zu schreiben – so etwas wie ein kleines Wörterbuch zum Erlernen von Fremdwörtern – und begann mir den Kopf zu zerbrechen: Wie könnte ich das schaffen? Das erste, was mir in den Sinn kam, war natürlich Swing. Jeder hat wahrscheinlich schon einmal von Swing gehört . Dies ist eine Bibliothek zum Erstellen grafischer Benutzeroberflächen. Aufgrund der Tatsache, dass unser geliebtes Oracle Swing noch nicht vollständig aufgegeben hat, gilt es nicht als veraltet und Anwendungen laufen immer noch darauf. Es wird jedoch nicht mehr von Swing modernisiert, und die Leute von Oracle haben uns einen Vorgeschmack auf die Zukunft von JavaFX gegeben. Und tatsächlich nutzt JavaFX Swing-Komponenten als Dienstleister)

Was ist JavaFX?

JavaFX ist im Wesentlichen ein GUI-Toolkit für Java. Hier wird ein kleiner Exkurs gemacht, und wir werden uns daran erinnern, was eine GUI ist : Grafische Benutzeroberfläche – eine grafische Benutzeroberfläche ist eine Art Benutzeroberfläche, in der alle Elemente (Schaltflächen, Menüs, Symbole, Listen) dem Benutzer auf dem angezeigt werden Die Darstellung erfolgt in Form von Bildern, Grafiken. Im Gegensatz zu einer Befehlszeilenschnittstelle hat der Benutzer in einer GUI über Eingabegeräte wahlfreien Zugriff auf sichtbare Objekte. Häufig werden Schnittstellenelemente in Form von Metaphern implementiert und zeigen deren Eigenschaften und Zweck, um dem Benutzer das Verständnis zu erleichtern. JavaFX zielt darauf ab, Spiele und Desktop-Anwendungen in Java zu erstellen. Tatsächlich wird es Swing aufgrund des vorgeschlagenen neuen GUI-Tools für Java ersetzen. Es ermöglicht uns auch, GUI-Layoutdateien (XML) zu formatieren und sie mithilfe von CSS eleganter zu gestalten, ähnlich wie wir es von Webanwendungen gewohnt sind. JavaFX verwaltet außerdem integrierte 3D-Grafiken sowie Audio-, Video- und eingebettete Netzwerkanwendungen in einem einzigen GUI-Toolkit ... Es ist leicht zu erlernen und gut optimiert. Es unterstützt viele Betriebssysteme sowie Windows, UNIX-Systeme und Mac OS. Einführung in Java FX - 3

JavaFX-Funktionen:

  • JavaFX verfügt zunächst über einen großen Satz grafischer Schnittstellenteile, wie z. B. alle möglichen Schaltflächen, Textfelder, Tabellen, Bäume, Menüs, Diagramme usw., was uns wiederum viel Zeit sparen wird.
  • JavaFX verwendet häufig CSS-Stile, und wir können ein spezielles FXML-Format verwenden, um die GUI zu erstellen, anstatt dies in Java-Code zu tun. Dies macht es einfach, schnell eine GUI zu gestalten oder das Erscheinungsbild oder die Zusammensetzung zu ändern, ohne lange mit Java-Code herumspielen zu müssen.
  • JavaFX verfügt über gebrauchsfertige Diagrammteile, sodass wir diese nicht jedes Mal von Grund auf neu schreiben müssen, wenn Sie ein einfaches Diagramm benötigen.
  • JavaFX bietet außerdem 3D-Grafikunterstützung, was oft nützlich ist, wenn wir Spiele oder ähnliche Anwendungen entwickeln.
Werfen wir einen kleinen Blick auf die Hauptkomponenten unseres Fensters:
  • Die Bühne ist im Wesentlichen ein umgebendes Fenster, das als Startfläche fungiert und die restlichen Komponenten enthält. Eine Bewerbung kann mehrere Stufen haben, es muss aber in jedem Fall eine solche Komponente vorhanden sein. Im Wesentlichen ist Stage der Hauptcontainer und Einstiegspunkt.
  • Szene – zeigt den Inhalt der Bühne an (wie eine Nistpuppe). Jede Stufe kann mehrere Komponenten – Szenen – enthalten, die untereinander vertauscht werden können. Intern wird dies durch einen Objektgraphen namens Scene Graph implementiert (wobei jedes Element ein Knoten ist, auch Node genannt ).
  • Knoten sind Steuerelemente wie Beschriftungsschaltflächen oder sogar Layouts, die mehrere verschachtelte Komponenten enthalten können. Jede Szene kann einen verschachtelten Knoten haben, es kann sich jedoch um ein Layout mit mehreren Komponenten handeln. Die Verschachtelung kann mehrstufig erfolgen, wobei Layouts andere Layouts und reguläre Komponenten enthalten. Jeder dieser Knoten hat seine eigene Kennung, seinen eigenen Stil, seine eigenen Effekte, seinen eigenen Status und seine eigenen Ereignishandler.
Einführung in Java FX - 4 Kommen wir also ein wenig zum Code. Da ich Java 8 verwende, muss ich keine Abhängigkeiten abrufen, da JavaFx standardmäßig im JDK enthalten ist (wie in Java 9.10), aber wenn wir Java 11+ haben, müssen wir zum Maven-Repository gehen und Ziehen Sie es aus den dortigen Abhängigkeiten.

JavaFX: Anwendungsbeispiele

Wir erstellen eine reguläre Klasse mit einer Methode main(Einstiegspunkt):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Hier erbt unsere Klasse von javafx.application.Application(was wir von der Bugaga-Box haben). Im Wesentlichen rufen wir die statische Application-Methode auf, launch()um unser Fenster zu starten. Außerdem wird sich unsere Idee darüber beschweren, dass wir die Anwendungsmethode nicht implementiert haben, startwas wir letztendlich tun. Wofür ist das? Und um die Eigenschaften (die Funktionalität unseres Fensters) verwalten zu können. Dazu verwenden wir ein eingehendes Argument, primaryStagefür das wir eine Methode aufrufen, showdamit wir sehen können, wie das Fenster geöffnet wird main. Lassen Sie uns unsere Methode ein wenig ergänzen 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();
}
Was sehen wir also hier? Gehen wir es Zeile für Zeile durch: 2 – Legen Sie den Namen des Fensters selbst fest (Stufe) 3.4 – Legen Sie seine Abmessungen fest 6.7 – Legen Sie den Pfad des Lesestroms zur Datei fest (Symbol) Einführung in Java FX - 58 – Erstellen Sie die Datei als Bildobjekt, die durch den im Konstruktor übergebenen Stream mit der realen Datei verbunden ist 9 - Setzen Sie ein Symbol im oberen Bereich des Fensters 11 - Erstellen Sie ein Schaltflächenobjekt 13-16 - Legen Sie die Reaktion fest, wenn die Schaltfläche gedrückt wird 17 - Erstellen Sie eine Szene, in der Wir platzieren unseren Button 18 – platzieren die Szene auf unserem gemeinsamen Fenster 20 – setzen die Sichtbarkeitsflagge für das Fenster. Und als Ergebnis erhalten wir ein kleines Fenster, um unsere Lieblingspesels willkommen zu heißen: Einführung in Java FX - 6Alles sieht viel einfacher aus als Swing, nicht wahr? Aber es ist noch nicht vorbei. Es ist nicht sinnvoll, den gesamten Code zu schreiben, um eine Anwendung anzuzeigen; Sie müssen ihn irgendwie aufteilen, um ihn verständlicher zu machen (grafische Komponenten in einem Korb, Logik in einem anderen). Und hier kommt XML ins Spiel ... Oh mein Gott, XML? Genau. Konkret verwenden wir die spezifische Implementierung für JavaFX – FXML, in der wir die grafischen Komponenten der Anwendung und ihre Eigenschaften (alle möglichen Größen usw.) definieren und sie dann mit einem Controller verbinden, der bei der Verwaltung der Logik hilft. Schauen wir uns ein Beispiel dieser XML-Datei an:
<?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 – die von uns verwendete Skriptsprache 4-6 – importierte Daten 8-9 Vbox – ein Container, der Unterkomponenten in einer Zeile platziert. 11 - etwas Text anzeigen 13 - eine Schaltfläche, wenn wir darauf klicken, verwenden wir die im Skript in den Zeilen 15-18 beschriebene Methode. In der Methode sollte Code zum Aufrufen dieser XML-Datei vorhanden sein start, aber das ist jetzt nicht so wichtig, und wir wird es weglassen (unten finden Sie ein Beispiel für das Abrufen dieser Datei). XML ist also natürlich gut (aber nicht sehr gut), es ist sehr verwirrend, sie manuell zu schreiben, ist das nicht das letzte Jahrhundert? Einführung in Java FX – 7

Einführung in JavaFX SceneBuilder

An diesem Punkt kommt (Trommelwirbel) ins Spiel – SceneBuilder In JavaFX ist Scene Builder ein Tool, mit dem wir unsere Fenster in Form einer grafischen Oberfläche entwerfen und dann speichern können, und dieses Programm wird dies basierend auf dem Ergebnis tun Erstellen Sie XML-Dateien, die wir in unserer Anwendung verbessern werden. Die Schnittstelle dieses FMXL-Builders sieht in etwa so aus: Einführung in Java FX – 8

Ein kleiner Exkurs. JavaFX-Lektionen

Ich werde die Installationsdetails und auch eine detaillierte Untersuchung dieses Tools überspringen. Dies sind Themen, die es wert sind, weiter erforscht zu werden. Daher werde ich noch ein paar interessante Links zu JavaFX-Lektionen hinterlassen: einen (ein Online-Tutorial zu JavaFX) und zwei (ein weiteres gutes Tutorial). Lassen Sie uns ein kleines Beispiel durchgehen, das ich skizziert habe. Am Ende bekam ich so etwas wie: Einführung in Java FX - 9
(so ähnlich wie ein Fenster zur Registrierung von Hunden)
Wenn Sie einen Hund auswählen und auf die Schaltfläche „Löschen“ klicken, wird der Hund aus unserer Liste entfernt. Wenn Sie einen vierbeinigen Freund auswählen, seine Felder ändern und auf die Schaltfläche „Bearbeiten“ klicken, werden die Informationen zum Hund aktualisiert. Wenn wir auf die Schaltfläche „Neu“ klicken, öffnet sich ein Fenster, in dem Sie einen Datensatz für einen neuen Hund erstellen können (zunächst mit seinem Namen): Einführung in Java FX – 10Klicken Sie dann auf „Speichern“, füllen Sie die restlichen Felder im ersten Fenster aus und klicken Sie dann auf die Schaltfläche „Bearbeiten“. speichern. Klingt einfach, oder? Mal sehen, wie das in unserer Java-Anwendung aussehen wird. Zunächst belasse ich hier einfach die XML-Layouts für diese beiden Fenster, die in generiert wurden SceneBuilder: Erstens (grundlegend):
<?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>
Zweitens (um neue Hündchen zu erstellen):
<?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>
So sieht die Ordnerstruktur aus: Einführung in Java FX - 11Wie Sie sehen, gibt es nichts Besonderes, es gibt Controller, die bestimmte Fenster darstellen, es gibt Modelle, die unsere Daten darstellen. Werfen wir einen Blick auf die Klasse, die die Anwendung startet (Anwendungsimplementierung): @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));
    }
Hier sehen wir einen Konstruktor, der unsere Anfangsdaten ausfüllt (die wir in einem speziellen Blatt – ObservableList) speichern.
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();
}
Nichts Besonderes – mainund die Implementierung start(), die die Anwendung startet:
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();
        }
    }
Hier sehen wir also die Methode, die wir tatsächlich starten start(), nämlich die, die die Einstellungen unseres Basisfensters festlegt. Zum Beispiel im XML-Layout in Ressourcen: Geben Sie ihm ein Symbol, verknüpfen Sie es mit einem bestimmten Controller und geben Sie dem Controller einen Link zur thisKlasse.
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();
        }
    }
}
Hier sehen wir die Methode, die für das Erscheinen des zweiten Fensters verantwortlich ist – das Fenster zum Erstellen eines neuen Datensatzes (der Name eines neuen Hundes). Wir legen auch den Controller, das XML-Layout, die Bühne usw. fest. Die nächste Klasse, die wir in Betracht ziehen, wird ein Modell sein, das unseren Hund darstellt (Informationen darüber): @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;
    }
}
Hier sehen wir zwei Konstruktoren. Einer ist fast ein regulärer mit allen Argumenten (fast, weil wir spezielle FX-Wrapper einfacher Typen verwenden) und ein Konstruktor ohne Argumente: Wir verwenden ihn beim Erstellen eines neuen Hundes, der zunächst nur einen hat Name. Controller für Basisfenster: @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;
Hier sehen wir unsere Objektfelder, jedoch im TextField-Format. Dies ist ein Format, das ein Texteingabefeld darstellt. @FXML ist eine Annotation, die dazu dient, Java-Code und das entsprechende Objekt unseres Layouts (Schaltfläche, Feld oder etwas anderes) zu verknüpfen.
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Hier sehen wir rechts in der Liste eine Methode zum Anzeigen von Hundenamen (ihre @FXML-Annotation bindet an die JavaFX-TableView-Layoutkomponente).
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("");
    }
}
In der ersten Methode sehen wir, wie wir einen internen Verweis auf die Klasse setzen, die Application implementiert (damit wir ihre Methode aufrufen können, um das zweite Fenster aufzurufen), und die anfängliche Liste festlegen, die angezeigt werden soll. Der zweite prüft, ob der aktuelle Hund über bestimmte Daten verfügt und legt darauf basierend die Textfelder fest:
@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);
        }
    }
}
Hier sehen wir drei Methoden des Basisfensters, die mit Schaltflächen verknüpft sind: Einführung in Java FX - 12
  • löschen – den ausgewählten (ausgewählten) Hund nach Index löschen;
  • Bearbeiten – Erstellen Sie einen neuen Hund mit den übertragenen Daten und legen Sie ihn anstelle des vorherigen fest;
  • create - Wir erstellen einen neuen Hund und rufen die Methode zum Aufrufen des Erstellungsfensters auf, übergeben ein neues Objekt und speichern nach dem Schließen das neue Haustier, wenn der Name nicht null ist.
Weiter geht es mit dem Fenster-Controller zum Erstellen des Hundes: @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();
    }
}
Hier sehen wir die Verbindung mit dem Textfeld im Fenster, das die Schaltflächen „Speichern“ und „Abbrechen“ verarbeitet, die das Fenster irgendwie schließen. Wie Sie sehen, habe ich aus Gründen der Bequemlichkeit in meiner kleinen Anwendung Lombok verwendet, da der Code sonst sehr gewachsen wäre und ich ihn nicht in meine Rezension aufgenommen hätte. Das ist wahrscheinlich alles, was ich für heute habe. Heute haben wir uns kurz mit den Grundkonzepten und einem Beispiel für die Verwendung von JavaFX vertraut gemacht und können kleine Desktop-Anwendungen erstellen (unter Verwendung zusätzlicher Informationen, die glücklicherweise im Internet reichlich vorhanden sind). Und Sie wiederum mögen))
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION