Jetzt anmelden...

Login
Passwort
Registrieren
20.08.21 401 Views Kommentare [0] 0 0

credit: ©pinkeyes/ adobe

JAVA Tutorial #54

JavaFX Text-Eingabefelder

Im letzten Tutorial haben wir uns die typischen button-artigen Bedienelemente angesehen. Eine andere wichtige Gruppe der Bedienelemente sind die Texteingabefelder. Werfen wir nun einen genaueren Blick darauf.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • Texteingabefelder sind ebenfalls JavaFX-Bedienelemente und gehören zum Paket javafx.scene.control
  • Alle Bedienelemente sind Nodes, die dem SceneGraph hinzugefügt werden.
  • Texteingabefelder nehmen die Nutzereingaben als Strings auf.

    Inhaltsverzeichnis

  1. TextField
  2. PasswordField
  3. TextArea

TextField

Die Klasse TextField erlaubt es dem Benutzer, eine Zeile unformatierten Text in ein Eingabefeld zu schreiben.

Der eingegebene Text kann dann mittels der Methode getText() beim Drücken der ENTER-Taste ausgelesen und an das Programm zurückgeliefert werden. Damit das funktioniert, muss ein EventHandler mit setOnAction() auf dem TextField registriert sein. Sehen wir uns das einmal an:

@Override
public void start(Stage primaryStage){

    TextField tf = new TextField();
    tf.setOnAction(e -> {
        System.out.println(tf.getText());
    });

    VBox layout = new VBox();
    layout.getChildren().add(tf);
    Scene scene = new Scene(layout, 200, 180);
    primaryStage.setScene(scene);
    primaryStage.show();
}

Java JavaFX TextField

Das Drücken der ENTER-Taste löst das Event aus und der eingegebene Text wird auf der Konsole geprinted.

Der Fokus

Dass wir das Event mit der ENTER-Taste auslösen können, liegt daran, dass das TextField-Element im Fokus ist. Da es das einzige Control-Node im Programm ist, hat es den Fokus automatisch erhalten.

Bei mehreren Control-Nodes müssen wir den Fokus manuell wählen bzw. abwählen. Dazu gibt es die Methode setFocusTraversable():

tf.setFocusTraversable(false); // Fokus abwählen
tf.setFocusTraversable(true); // Fokus auswählen

Text via Button abfragen

Natürlich können wir den Text eines TextFields auch über ein anderes Node abfragen, zum Beispiel über einen Button:

Button btn = new Button("Submit");
btn.setOnAction(e -> {
    System.out.println(tf.getText());
});     

Platzhalter setzen

Ein TextField kann mit einem vordefinierten Platzhaltertext augezeichnet werden, der angezeigt wird, wenn das TextField nicht im Fokus steht.

tf.setPromptText("Text hier eingeben");            

Das sieht dann so aus:

Java JavaFX TextField Platzhalter

Strings in Zahlen umwandeln

Alle Texteingaben werden von Java grundsätzlich als Strings aufgenommen. Damit sind arithmetische Operationen erst einmal unmöglich.

Wenn eine Eingabe und Weiterverarbeitung von Zahlen erforderlich ist, muss die als String ins Programm gekommene Nutzereingabe in einen numerischen Datentyp umgewandelt werden. Mithilfe der Wrapper-Klassen können wir Strings in primitive Werte parsen:

TextField tf = new TextField();
tf.setOnAction(e -> {
    try {
        double x = Double.parseDouble(tf.getText()); // String in Double-Wert umwandeln
        System.out.println(x * x); // Rechne!
    } catch (NumberFormatException numberFormatException) {
        System.out.println("Keine Zahl eingegeben");
    }
});  

PasswordField

Damit der Benutzer einen "versteckten" Text für Passwörter eingeben kann, gibt es die Klasse PasswordField. PasswordField ist eine Unterklasse von TextField und wird daher genauso eingesetzt:

PasswordField pw = new PasswordField();

pw.setOnAction(e -> {
    System.out.println(pw.getText());
});                

Java JavaFX PasswordField

TextArea

Das Eingabefeld TextArea erlaubt dem Benutzer das Eintippen von mehrzeiligem Text. Hier ein Beispiel:

@Override
public void start(Stage primaryStage){

    TextArea area = new TextArea();
    area.setPrefColumnCount(20);
    area.setPrefRowCount(15);
    area.setWrapText(true);

    // Eingabe via Button abfragen
    Button btn = new Button("Submit");
    btn.setOnAction(e -> {
        System.out.println(area.getText());
    });

    VBox layout = new VBox();
    layout.getChildren().addAll(new Group(area), btn);

    Scene scene = new Scene(layout, 500, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
}
}                

Und so sieht das dann aus:

Java JavaFX TextArea

Wie du im Code erkennen kannst, haben wir mit den beiden Methoden setPrefColumnCount() und area.setPrefRowCount() die Breite und Länge des TextArea-Feldes angepasst. Das funktioniert aber nur dann, wenn das TextArea-Node in eine Group integriert ist (Zeile 16). Würde die TextArea direkt in den Layout-Container gepackt werden, erhielte es automatisch die volle Breite.

Die Methode setWrapText(true) (Zeile 7) bewirkt außerdem, dass der Text automatisch umgebrochen wird, wenn der User bis zum Rand des Eingabefeldes tippt. Ohne die Methode würden horizontale Scoll-Balken entstehen, was in der Regel nicht gewünscht ist.

Falconbyte unterstützen

Kommentar schreiben

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Scope von Variablen

Wie lange lebt eine Variable eigentlich?

Java einrichten

Erfahren Sie, wie einfach es ist, mit Java zu beginnen

Pass-by-value in Java

wie genau der Vorgang der Parameterübergabe bei Methoden abläuft, klären wir hier.

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2021 Stefan E. Heller

Impressum | Datenschutz

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen