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.
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();
}
Das Drücken der ENTER-Taste löst das Event aus und der eingegebene Text wird auf der Konsole geprinted.
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
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());
});
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:
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");
}
});
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());
});
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:
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.
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]