JavaRush /Java Blog /Random-IT /Introduzione a JavaFX

Introduzione a JavaFX

Pubblicato nel gruppo Random-IT
Un giorno mi è venuta l'idea di scrivere una piccola applicazione desktop per le mie esigenze - qualcosa come un piccolo dizionario per imparare parole straniere - e ho iniziato a tormentarmi, come potrei farlo? Naturalmente la prima cosa che mi è venuta in mente è stata lo Swing. Probabilmente tutti hanno sentito parlare di Swing . Questa è una libreria per la creazione di interfacce grafiche utente. Dato che il nostro amato Oracle non ha ancora abbandonato completamente Swing, non è considerato obsoleto e su di esso continuano a funzionare le applicazioni. Tuttavia, non viene più modernizzato da Swing e i ragazzi di Oracle ci hanno dato un assaggio di quale sarà il futuro di JavaFX. E infatti JavaFX utilizza i componenti Swing come fornitore di servizi)

Cos'è JavaFX?

JavaFX è essenzialmente un toolkit GUI per Java. Faremo una piccola digressione qui e ricorderemo cos'è una GUI : Interfaccia utente grafica - un'interfaccia utente grafica è un tipo di interfaccia utente in cui tutti gli elementi (pulsanti, menu, icone, elenchi) presentati all'utente sulla la visualizzazione è realizzata sotto forma di immagini, grafica. A differenza di un'interfaccia a riga di comando, in una GUI l'utente ha accesso casuale agli oggetti visibili utilizzando dispositivi di input. Spesso gli elementi dell'interfaccia sono implementati sotto forma di metafore e mostrano le loro proprietà e il loro scopo per facilitare la comprensione dell'utente. JavaFX ha lo scopo di creare giochi e applicazioni desktop in Java. In effetti, sostituirà Swing grazie alla proposta del nuovo strumento GUI per Java. Inoltre, ci consente di definire uno stile per i file di layout della GUI (XML) e renderli più eleganti utilizzando i CSS, in modo simile a quello a cui siamo abituati nelle applicazioni web. JavaFX gestisce inoltre la grafica 3D integrata nonché le applicazioni audio, video e di rete integrate in un unico toolkit GUI... È facile da imparare e ben ottimizzato. Supporta molti sistemi operativi, oltre a Windows, sistemi UNIX e Mac OS. Introduzione a JavaFX - 3

Caratteristiche JavaFX:

  • JavaFX inizialmente viene fornito con un ampio set di parti dell'interfaccia grafica, come tutti i tipi di pulsanti, campi di testo, tabelle, alberi, menu, grafici, ecc., che a loro volta ci faranno risparmiare molto tempo.
  • JavaFX utilizza spesso gli stili CSS e saremo in grado di utilizzare uno speciale formato FXML per creare la GUI, invece di farlo nel codice Java. Ciò semplifica la creazione rapida di una GUI o la modifica dell'aspetto o della composizione senza dover giocare a lungo con il codice Java.
  • JavaFX dispone di parti di diagramma pronte all'uso, quindi non dobbiamo scriverle da zero ogni volta che ti serve un diagramma di base.
  • JavaFX include inoltre il supporto per la grafica 3D, che spesso è utile se stiamo sviluppando qualche tipo di gioco o applicazioni simili.
Diamo un piccolo sguardo ai componenti principali della nostra finestra:
  • Lo stage è essenzialmente una finestra circostante che funge da tela iniziale e contiene il resto dei componenti. Un'applicazione può avere più fasi, ma in ogni caso deve esserci uno di questi componenti. Essenzialmente, Stage è il contenitore principale e il punto di ingresso.
  • Scena : mostra il contenuto dello stage (come una bambola che nidifica). Ogni fase può contenere diversi componenti - scena, che possono essere scambiati tra loro. Internamente, questo è implementato da un oggetto grafico chiamato Scene Graph (dove ogni elemento è un nodo, chiamato anche Node ).
  • I nodi sono controlli, come i pulsanti delle etichette o anche i layout, che possono avere più componenti nidificati al loro interno. Ogni scena può avere un nodo nidificato, ma può essere un layout con più componenti. La nidificazione può essere multilivello, con layout contenenti altri layout e componenti regolari. Ciascuno di questi nodi ha il proprio identificatore, stile, effetti, stato e gestori di eventi.
Introduzione a JavaFX - 4 Spostiamoci quindi un po' verso il codice. Poiché utilizzo Java 8, non ho bisogno di creare dipendenze, poiché JavaFx è nel JDK per impostazione predefinita (come in Java 9.10), ma se abbiamo Java 11+, dobbiamo andare al repository Maven e tiralo da lì dipendenze.

JavaFX: esempi di utilizzo

Creiamo una classe regolare con un metodo main(punto di ingresso):
public class AppFX extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
pimarySatge.show();
    }
}
Qui la nostra classe eredita da javafx.application.Application(che abbiamo dalla scatola Bugaga). In main chiamiamo il metodo Application statico launch()per avviare la nostra finestra. Inoltre, la nostra idea si lamenterà del fatto che non abbiamo implementato il metodo Applicazione, startche è ciò che alla fine facciamo. Cosa serve? E per poter gestire le proprietà (la funzionalità della nostra finestra). Per fare ciò, utilizziamo un argomento in entrata primaryStagesul quale chiamiamo un metodo showin modo da poter vedere la finestra avviata in main. Compiliamo un po' il nostro metodo 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();
}
Quindi cosa vediamo qui? Esaminiamolo riga per riga: 2 - imposta il nome della finestra stessa (stage) 3.4 - imposta le sue dimensioni 6.7 - imposta il percorso del flusso di lettura sul file (icona) Introduzione a JavaFX - 58 - crea il file come oggetto Immagine, che è collegato al file reale dallo stream passato nel costruttore 9 - imposta un'icona nel pannello superiore della finestra 11 - crea un oggetto pulsante 13-16 - imposta la reazione quando viene premuto il pulsante 17 - crea una scena in cui posizioniamo il nostro pulsante 18 - posizioniamo la scena sulla nostra finestra comune 20 - impostiamo il flag di visibilità per la finestra E come risultato otteniamo una piccola finestra per accogliere i nostri pesel preferiti: Introduzione a JavaFX - 6Tutto sembra molto più semplice di Swing, non è vero? Ma non è ancora finita. Non va bene scrivere tutto il codice per visualizzare un'applicazione; è necessario suddividerlo in qualche modo per renderlo più comprensibile (componenti grafici in un paniere, logica in un altro). E qui entra in gioco xml... Oh mio Dio, xml? Esattamente. Nello specifico, utilizziamo la sua implementazione specifica per JavaFX - FXML, in cui definiamo i componenti grafici dell'applicazione e le loro proprietà (tutti i tipi di dimensioni, ecc.), quindi la colleghiamo a un controller, che aiuta a gestire la logica. Diamo un'occhiata ad un esempio di questo 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 - il linguaggio di scripting che utilizziamo 4-6 - dati importati 8-9 Vbox - un contenitore che posiziona i sottocomponenti su una riga. 11 - visualizza del testo 13 - un pulsante, quando si fa clic, utilizziamo il metodo descritto nello script alle righe 15-18. Dovrebbe esserci un codice per chiamare questo file xml nel metodo start, ma ora questo non è così importante e noi lo ometterà (sotto ci sarà un esempio di estrazione di questo file). Quindi xml è, ovviamente, buono (ma non molto buono), scriverli manualmente crea molta confusione, non è questo il secolo scorso? Introduzione a JavaFX - 7

Presentazione di JavaFX SceneBuilder

È a questo punto che (rullo di tamburi) entra in gioco - SceneBuilder In JavaFX Scene Builder è uno strumento con cui potremo progettare le nostre finestre sotto forma di interfaccia grafica e poi salvarle, e questo programma, in base al risultato, le costruire file xml che miglioreremo nella nostra applicazione. L'interfaccia di questo builder fmxl è simile a questa: Introduzione a JavaFX - 8

Una piccola digressione. Lezioni di JavaFX

Tralascerò i dettagli di installazione e anche uno studio dettagliato di questo strumento. Questi sono argomenti che vale la pena approfondire. Lascerò quindi ancora un paio di link interessanti alle lezioni di JavaFX: uno (tutorial online su JavaFX) e due (un altro buon tutorial). Esaminiamo un piccolo esempio che ho abbozzato. Alla fine ho ottenuto qualcosa del tipo: Introduzione a JavaFX - 9
(una sorta di finestra per la registrazione dei cani)
Quando selezioni un cane e premi il pulsante Elimina, il cane viene rimosso dal nostro elenco. Quando selezioni un amico a quattro zampe e modifichi i suoi campi, e dopo aver premuto il pulsante Modifica, le informazioni del cane vengono aggiornate. Quando premiamo il pulsante Nuovo, si apre una finestra per creare un record per un nuovo cane (per iniziare con il suo nome): Introduzione a JavaFX - 10quindi fare clic su Salva e compilare il resto dei suoi campi nella prima finestra, quindi fare clic sul pulsante Modifica per salva. Sembra facile, vero? Vediamo come apparirà nella nostra applicazione Java. Per cominciare, lascerò qui i layout xml per queste due finestre generate in SceneBuilder: Primo (base):
<?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>
Secondo (per creare nuovi cagnolini):
<?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>
Come si presenta la struttura delle cartelle: Introduzione a JavaFX - 11Come puoi vedere, non c'è niente di speciale, ci sono controller che rappresentano determinate finestre, ci sono modelli che rappresentano i nostri dati. Diamo un'occhiata alla classe che avvia l'applicazione (Implementazione dell'applicazione): @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));
    }
Qui vediamo un costruttore che riempirà i nostri dati iniziali (che memorizziamo in un foglio speciale - 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();
}
Niente di speciale - maine l'implementazione start()che avvia l'applicazione:
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();
        }
    }
Quindi, qui vediamo il metodo che effettivamente lanciamo in start(), vale a dire quello che imposta le impostazioni della nostra finestra di base. Come nel layout xml nelle risorse: assegnandogli un'icona, collegandolo a un controller specifico e fornendo al controller un collegamento alla thisclasse)
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();
        }
    }
}
Qui vediamo il metodo responsabile dell'aspetto della seconda finestra: la finestra per la creazione di un nuovo record (il nome di un nuovo cane). Impostiamo anche il controller, il layout xml, lo stage, ecc... La prossima classe che prenderemo in considerazione sarà un modello rappresentante il nostro cane (informazioni a riguardo): @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;
    }
}
Qui vediamo due costruttori: uno quasi normale con tutti gli argomenti (quasi, perché usiamo speciali wrapper FX di tipi semplici) e un costruttore senza argomenti: lo usiamo quando creiamo un nuovo cane, che all'inizio ha solo un nome. Controller per la finestra di base: @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;
Qui vediamo i nostri campi oggetto, ma in formato TextField. Questo è un formato che rappresenta un campo di input di testo. @FXML è un'annotazione progettata per collegare il codice Java e l'oggetto corrispondente del nostro layout (pulsante, campo o qualcos'altro).
@FXML
private void initialize() {
    nameList.setCellValueFactory(
            cellData -> cellData.getValue().getName());
    dogs.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> showDogsInformation(newValue));
}
Qui vediamo un metodo per visualizzare i nomi dei cani, a destra nell'elenco (la sua annotazione @FXML si lega al componente di layout 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("");
    }
}
Nel primo metodo vediamo impostare un riferimento interno alla classe che implementa Application (in modo da poter chiamare il suo metodo per richiamare la seconda finestra), e impostare la lista iniziale da visualizzare. La seconda controlla se il cane corrente ha determinati dati, e in base a questi imposta i campi di testo:
@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);
        }
    }
}
Qui vediamo tre metodi della finestra base associati ai pulsanti: Introduzione a JavaFX - 12
  • elimina : elimina il cane selezionato (selezionato) per indice;
  • modifica : crea un nuovo cane con i dati trasferiti e impostalo al posto di quello precedente;
  • crea : creiamo un nuovo cane e chiamiamo il metodo per chiamare la finestra di creazione, passando un nuovo oggetto e dopo aver chiuso il quale, se il nome non è nullo, salviamo il nuovo animale domestico.
Andando avanti, il controller della finestra per la creazione del cane: @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();
    }
}
Qui vediamo la connessione con il campo di testo nella finestra, l'elaborazione dei pulsanti Salva e Annulla, che in qualche modo chiudono la finestra. Come puoi vedere, per maggiore comodità nella mia piccola applicazione, ho utilizzato Lombok, altrimenti il ​​codice sarebbe cresciuto molto e non lo avrei inserito nella mia recensione. Probabilmente è tutto quello che ho per oggi. Oggi abbiamo brevemente conosciuto i concetti di base e un esempio di utilizzo di JavaFX e possiamo creare piccole applicazioni desktop (utilizzando informazioni aggiuntive, che, fortunatamente, sono abbondanti su Internet). E tu, a tua volta, come))
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION