Demo-App GridPane und ListView

!! VERALTET !!

package my.pkg;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * JavaFX Probe-App mit BorderPane, TextField und Button, etc.; Stand 2022-02-14
 *
 * @author Maximilian_Renkin
 */
public class JfxApp extends Application {

    public JfxApp() {
        System.out.println("Constructor JfxApp() called");
    }

    public static void main(String[] args) {
        System.out.println("main(...) called, now calling launch(...)");
        launch(args); // ruft indirekt start(...) auf
        System.out.println("main(...) finished");
    }

    @Override    // Optional Initialis. VOR Zugriff auf GUI (Dateien auslesen, etc.)!!
    public void init() throws Exception {
        super.init();
        System.out.println("init() - initialization (BEFORE access to GUI) called");
    }

    @Override
    public void stop() throws Exception {
        // Aufraeumen - MIT Zugriff auf GUI
        System.out.println("stop() called");
        super.stop();
    }

    @Override
    public void start(Stage primaryStage) throws Exception { // Hauptfenster als Param geliefert
        // start(...) indirekt aufgerufen von launch(...), ihrerseits in main(...) aufgerufen
        System.out.println("start(...)- the GUI activities - called)");
        // Vom JavaFX Laufzeitsystem wird das Hauptfenster (hier 'primaryStage') bereitgestellt.
        // Erzeugen Basis-Container - entspricht in HTML ca. dem Bereich innerhalb <body>...</body>:
        BorderPane root = new BorderPane(); // Wurzel-Container aller GUI-Elem., 'scene' übergeben
        // BorderPane hat 5 Bereiche: Top, Bottom, Left, Right, Center, die separate Inhalte haben.
        //
        // Scene ist gesamter Window-Inhalt - Fenstertitel, UI-Elemente wie Menü, Hauptbereich -
        // in Analogie zu Webseite entspricht es allem innerhalb von <html>...</html>.
        // Bei Erzeugung der Scene wird Basis-Container, Breite, Höhe des Fensters übergeben:
        Scene scene = new Scene(root, 450, 250);
        // Es können CSS-Stylesheets verwendet werden. Hier wird die aktuelle Stylesheet-Liste
        // abgefragt und eine eigene Stylesheet-Datei hinzugefügt (Pfad rel. zu Module-Basis-Dir):
        String cssUrl = getClass().getResource("jfx-app.css").toExternalForm();
        scene.getStylesheets().add(cssUrl);
        System.out.format("CSS-File URL is '%s'%n", cssUrl);
        //
        // nun wird dieser Basis-Container dem Hauptfenster zugeordnet:
        primaryStage.setScene(scene);
        //
        // der Fenstertitel wird gesetzt (wie HTML-<title>):
        primaryStage.setTitle("Mein erstes JavaFX-Programm");
        //
        // Nun erstellen wir einige "richtige" UI-Elemente: ein Label, anschließend
        // einem der Container-Arten: VBox ...
        Label lblHello = new Label("Hello User!"); // Erzeugen
        // Label z.B. einfach mit CSS stylen - spezielle CSS-Namen mit Prefix '-fx-':
        lblHello.setStyle("-fx-font-size: 2em;-fx-background-color:yellow; -fx-text-fill: blue;");

        root.setTop(lblHello);  // Variable nötig, da weitere Operation: setStyle(..)
        root.setBottom(new Label("Das ist der Bottom-Bereich, für Status-Info o.ä.")); // direkt
        //
        // Zur Demo noch schnell ein Label im linken und rechten Bereich:
        root.setLeft(new Label("Linker\nBereich")); // wenn Label nicht direkt ansprechbar sein muss
        Label lbl4RootRight = new Label("hier\nist\nrechts!"); // \n ... Zeilenschaltung
        root.setRight(lbl4RootRight); // Label in Variabler kann später leicht geändert werden:
        lbl4RootRight.setMinWidth(100);
        //
        //root.setCenter(new Label("Center-Bereich"));
        root.setCenter(composeListForm()); // hier wird das Mini-Formular im Center plaziert
        //
        primaryStage.show(); // erzeugtes Fenster wird erst nach expliziter Aufforderung angezeigt.
        System.out.println("start(...) finished");
    }

    private GridPane composeListForm() {
        GridPane myGridPane = new GridPane();
        myGridPane.setGridLinesVisible(true);
        /////////////// Hilfsvariable zur Bedeutungsklärung ///////////////
        final int row0 = 0, row1 = 1, row2 = 2, row3 = 3, row4 = 4,
                row5 = 5, row6 = 6,  row7 = 7, row8 = 8, row9 = 9;
        final int col0 = 0, col1 = 1, col2 = 2, col3 = 3;
        final int colspan1 = 1, colspan2 = 2, colspan3 = 3, rowspan1 = 1, rowspan2 = 2,
                rowspan7 = 7, rowspan9 = 9;
        final double col0minWd = 120.0, col1minWd = 80.0, col2minWd = 120.0, col3minWd = 120.0;

        List<String> wordList; // = new ArrayList();
        wordList = new ArrayList<String>(Arrays.asList("Haus", "Auto", "PC", "Urlaub", "Rücksicht"));
        //wordList = Arrays.asList(new String[]{"Haus", "Auto", "PC", "Urlaub", "Rücksicht"});
        //wordList.addAll(Arrays.asList(new String[]{"Haus", "Auto", "PC", "Urlaub", "Rücksicht"}));
        ObservableList<String> obsListWords = FXCollections.observableArrayList(wordList);
        obsListWords.add("Vorsicht");
        wordList.add("Umsicht");
        ListView<String> lvwWords = new ListView<>(obsListWords);

        for (int i = 0; i < wordList.size(); i++) {
            System.out.format("idx=%2d: val='%s'%n", i, wordList.get(i));
        }
        lvwWords.setMinHeight(100);
        lvwWords.setMinWidth(col0minWd);
        lvwWords.setPrefWidth(col0minWd * 1.5);
        myGridPane.add(lvwWords, col0, row0, colspan1, 7);
        myGridPane.add(new Label("col1/row3"), col1, row3, colspan1, rowspan1);  // Demo
        myGridPane.add(new Label("col1/row4"), col1, row4);  // Demo
        myGridPane.add(new Label("col2/row6"), col2, row6);  // Demo

        lvwWords.getSelectionModel().selectedItemProperty().addListener(listener -> {
            String selTxt = lvwWords.getSelectionModel().getSelectedItem();
            System.out.format("Selection changed - now '%s'!%n", selTxt);
        });
        return myGridPane;
    }

    //////////////// Erläuterung VarArgs /////////////////////////////
    public void testVarArgs1(float f, String... strings) {
        for (int i = 0; i < strings.length; i++) {
            System.out.format("Idx=%d: Val='%s'%n", i, strings[i]);
        }
    }

    public void testVarArgs2(String[] strings) {
        for (int i = 0; i < strings.length; i++) {
            System.out.format("Idx=%d: Val='%s'%n", i, strings[i]);
        }
    }

    public void testVarArgsUse() {
        System.out.println("VarArgs use:");

        testVarArgs1(99.0f, "Das", "ist", "ein", "Test");
        String[] strings = { "Das", "ist", "ein", "Test" };
        testVarArgs1(99.0f, strings);

        // geht nicht (vararg muss letztes Argument sein):
        // public void testVarArgs3(String... s, float f) {
        // ...
    }
    // String... strings = "";
    //testVarArgs2("Das", "ist", "ein", "Test");
}

https://stackoverflow.com/questions/34794995/how-to-serialize-observablelist [java - How to serialize ObservableList - Stack Overflow] …​ 2024-05-13