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");
}
1. Links:
https://stackoverflow.com/questions/34794995/how-to-serialize-observablelist [java - How to serialize ObservableList - Stack Overflow] … 2024-05-13