Java FX Kontrollelemente

Willemers Informatik-Ecke

Das einzig seriöse Javabuch :-) Mehr...


Bei Amazon bestellen

Ferien an der Flensburger Förde
Falls ich Ihnen helfen konnte:!
Vielen Dank!!!
2017-04-06

Label

Ein Label zeigt einen Text an. Es dient der Beschriftung von Dialogen, aber auch, um Ergebnisse anzuzeigen. Der Label an sich ist passiv. Es fängt keine Ereignisse, sondern ist einfach nur schön.

import javafx.scene.control.Label;
// ...
Label beschriftung = new Label("Erhellender Text");
Auch wenn er karg daher kommt, so sind doch fast alle Kontrollelemente seine Kinder und erben darum auch seine Methoden:

Button

Buttons nehmen einen Klick entgegen und führen fast immer zu Aktionen. Darum wird ihnen über die Methode setOnAction ein
Eventhandler zugewiesen.

Ihre Beschriftung erhalten Buttons entweder durch ihren Konstruktorparameter oder durch die Methode setText.

Button button = new Button();
button.setText("Drück mich!");
button.setOnAction(new EventHandler<ActionEvent>() {
     @Override
     public void handle(ActionEvent event) {
         System.out.println("Hab' Dich auch lieb!");
     }
});

TextField

Ein Eingabefeld, damit der Anwender auch mal einen Namen, eine Zahl oder eine sonstige Textzeile eingeben kann.

In den meisten Fällen müssen diese Felder nur beim Start eines Dialogs gesetzt und beim Beenden wieder ausgelesen werden. Dazu dienen die Methoden getText() und setText().

TextField eingabe = new TextField();
eingabe.setText("Vorgabeeingabe");
String str = eingabe.getText();
Auch das TextField kennt Ereignisse, die den Programmierer interessieren. Darunter fällt der Fokuswechsel. Ein Kontrollelement hat den Fokus, wenn die Tastatur auf das Element gelenkt ist. Besonders spannend ist bei einem TextField der Fokusverlust, weil in diesem Augenblick geprüft werden kann, ob die Eingabe korrekt ist.
TextField eingabe = new TextField();
eingabe.focusedProperty().addListener(new InvalidationListener() {
    @Override
    public void invalidated(Observable observable) {
        if (eingabe.isFocused()) {
            System.out.println("Fokus bekommen");
        } else {
            System.out.println("Fokus verloren");
        }
    }
});
Soll die fehlerhafte Eingabe beim Eintippen verhindert werden, erzeugen Sie eine eigene Klasse, die TextField erweitert und überschreiben die Methode replace. Die folgende Klasse lässt nur numerische Eingaben zu. Sie ersetzt für numerische Eingaben die Klasse TextField.
class NumTextField extends TextField {
    @Override
    public void replaceText(int start, int end, String text) {
        if (text.isEmpty() || "0123456789.,-".contains(text)) {
            super.replaceText(start, end, text);
        }
    }
}

CheckBox und ToggleButton

Diese beiden Abarten des Buttons dienen dazu den logischen Status durch einen Haken (CheckBox) oder durch Tiefe (ToggleButton) darzustellen und zu erfassen.
CheckBox check = new CheckBox("Check");
ToggleButton toggle = new ToggleButton("Toggle");

RadioButton

Ein RadioButton entspricht in seiner Funktion einem ToggleButton. Seine Besonderheit ist, dass er in einer ToggleGroup organisiert ist. Von allen zu einer ToggleGroup organisierten RadioButtons kann nur einer aktiviert sein.

Ein RadioButton wird über seine Methode setToggleGroup der Gruppe zugewiesen, die als Parameter übergeben wird.

ToggleGroup senderGroup = new ToggleGroup();
RadioButton radioArd = new RadioButton("ARD");
radioArd.setToggleGroup(senderGroup);

ChoiceBox oder ComboBox

Bei ChoiceBox und ComboBox handelt es sich um Klapplisten, aus deren Elementen der Anwender eines auswählen kann. Zur Füllung der Klappliste wird eine
ObservableList eingesetzt.
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.ChoiceBox;
// ...
ChoiceBox<String> wahl = new ChoiceBox<String>();
ObservableList<String> list = FXCollections.observableArrayList
                ("ARD", "ZDF", "N3");
wahl.setItems(list);
wahl.addEventHandler(ActionEvent.ACTION, new EventHandler() {
    @Override
    public void handle(ActionEvent event) {
        System.out.println(wahl.getValue()); // selektiertes Element;
    }
});

ListView

Die ListView wird wie ComboBox und ChoiceBox mit einer
ObservableList gefüllt. Sie nimmt naturgemäß mehr Raum ein und dient nicht in erster Linie der Auswahl sondern der Darstellung von Daten.

ListViews können auch mehrere Spalten darstellen.

TableView

Der TableView entspricht einer ListView, verfügt aber darüber hinaus auch noch Spaltenüberschriften.

Menüs

import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
...
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu("File");
Menu menuEdit = new Menu("Edit");
Menu menuView = new Menu("View");
menuBar.getMenus().addAll(menuFile, menuEdit, menuView);
Das Menü muss noch in das Fenster eingebaut werden. Der Rahmen des Fensters ist meist sinnvollerweise ein
BorderPane, in dessen Top-Bereich ein Menü geradezu ideal hineinpasst.
root.setTop(menuBar);
Nun haben wir eine Menüleiste, es fehlen aber die Menüpunkte, die man unter FX MenuItem nennt. Sie müssen erzeugt werden und in das passende Menu mit der Methode addAll() eingehängt werden.
MenuItem mnOpen = new MenuItem("Öffnen");
MenuItem mnSave = new MenuItem("Speichern");
MenuItem mnEnde = new MenuItem("Ende");
mnDatei.getItems().addAll(mnOpen, mnSave, mnEnde);
Zu guter Letzt soll natürlich auch irgendetwas passieren, wenn der Benutzer auf die Menüpunkte klickt, sonst hätte man sich den ganzen Zirkus ja auch sparen können. In dieser Hinsicht verhalten sich Menüpunkte wie Buttons und binden mit der Methode setOnAction() einen Eventhandler an ihre Aktion.
mnEnde.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {
        System.exit(0);
    }
});


Homepage - Java - Java FX (C) Copyright 2017 Arnold Willemer