JAVA Tutorial #54

JavaFX Text-Eingabefelder

2021-08-20 | credit: ©pinkeyes/ adobe

Overview

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.

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();
}
JavaFX Texteingabefeld

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:

JavaFX TextField Placeholder

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());
});
JavaFX PasswordField

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:

JavaFX Textfield

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) 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.

Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen