studyklar
GdI 2 · Probeklausur Teil 2 · Aufgabe 11

JavaFX: ein Button erhöht die Zahl im Textfeld um 1

Ein kleines Fenster mit dem Button „Plus eins“ und einem Textfeld. Bei jedem Klick soll die Zahl im Feld um 1 wachsen. Dafür fehlen nur fünf Zeilen: Sie lesen den Text, rechnen und schreiben das Ergebnis zurück. Rechts stehen das Fenster als Skizze, der Weg eines Klicks und das Programm. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 11

Gegeben ist der folgende Code einer JavaFX-Anwendung. Die Package- und Importangaben sind aus Gründen der Übersicht nicht mit abgedruckt.

Ergänzen Sie den Code so, dass beim Drücken des Buttons der im Textfeld eingegebene (oder dort bereits vorhandene) ganze Zahlenwert um 1 erhöht wird. Im Textfeld soll anschließend der um 1 erhöhte Wert angezeigt werden.

Sie können davon ausgehen, dass immer nur ganze Zahlenwerte eingegeben werden. Fehleingaben brauchen daher nicht behandelt zu werden.

public class EinsHoch extends Application {     @Override    public void start(Stage primaryStage) {        VBox root = new VBox();        Button button = new Button("Plus eins");        TextField textFeld = new TextField("1");          root.getChildren().addAll(button, textFeld);        Scene scene = new Scene(root, 200, 100);        primaryStage.setTitle("Eins Hoch");        primaryStage.setScene(scene);        primaryStage.show();    }     public static void main(String[] args) {        launch(args);    }}

(Im Original steht zwischen Zeile 7 und dem addAll eine leere Fläche zum Ergänzen.)

Gegeben ist ein fertiges Fenster: oben der Button, darunter ein Textfeld mit der 1. Noch passiert beim Klick nichts. Gesucht sind die Zeilen, die dem Button eine Aktion geben: Zahl aus dem Feld lesen, um 1 erhöhen, wieder anzeigen. Falsche Eingaben müssen nicht behandelt werden.

Merke: Ein Textfeld kennt nur Text (String). Rechnen kann man nur mit Zahlen (int). Darum gilt immer: Text lesen, in eine Zahl umwandeln, rechnen, die Zahl wieder in Text umwandeln, Text setzen.
  1. Dem Button mit setOnAction eine Aktion geben.
  2. Den Text lesen und in eine Zahl umwandeln.
  3. Die Zahl um 1 erhöhen.
  4. Das Ergebnis als Text ins Feld schreiben.
  5. Probelauf.

Zu dieser Probeklausur gibt es keine Musterlösung. Die Lösung hier ist selbst erarbeitet, mit JavaFX übersetzt und im Fenster ausprobiert.

setOnAction: was beim Klick passiert

        button.setOnAction(e -> {

Hier kommt der Rumpf hin (Zeilen 10 bis 12).

        });

Was ein Button beim Drücken tut, legt button.setOnAction(…) fest. In die Klammer kommt ein Lambda, eine Methode ohne Namen: e -> { … }. Links vom Pfeil steht der Parameter e, das Ereignis (der Klick). Rechts in geschweiften Klammern steht, was dann ausgeführt wird. e brauchen wir hier nicht.

Die neuen Zeilen gehören in die Lücke nach Zeile 7. Dort gibt es button und textFeld schon. Der Rumpf des Lambdas folgt in den nächsten drei Schritten.

Aus Blatt 10, Aufgabe 2 („Springender Button: Klick und Mausberührung“): setOnAction bekommt ein Lambda. Sein Rumpf läuft bei jedem Klick auf den Button.

Text lesen und in eine Zahl umwandeln

            int zahl = Integer.parseInt(textFeld.getText());

textFeld.getText() liefert den Inhalt des Feldes als String, am Anfang „1“. Mit einem String kann man nicht rechnen. Integer.parseInt(…) wandelt ihn in eine ganze Zahl (int) um.

Bei „abc“ würde parseInt eine Exception werfen. Die Aufgabe sagt aber, dass nur ganze Zahlen eingegeben werden. Ein try-catch ist darum nicht nötig.

Aus Blatt 8, Aufgabe 3 („Ist dieser Text eine ganze Zahl? Prüfen mit NumberFormatException“): Integer.parseInt(text) macht aus einem Text wie „42“ die Zahl 42. Ist der Text keine ganze Zahl, wirft es eine NumberFormatException.
Noch 4 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Eins Hoch

Fenster und ein Klick

Abbildung 1Eins Hoch

Fenster und ein Klick

Fenster „Eins Hoch“, VBox root
Plus eins
1
getText()"1"String
parseInt1int
+ 12int
setText"2"String
LegendeOben das Fenster, darunter was ein Klick mit dem Text im Feld macht.

Abbildung 1Eins Hoch

Fenster und ein Klick

public class EinsHoch extends Application {     @Override    public void start(Stage primaryStage) {        VBox root = new VBox();        Button button = new Button("Plus eins");        TextField textFeld = new TextField("1");         button.setOnAction(e -> {            int zahl = Integer.parseInt(textFeld.getText());            zahl = zahl + 1;            textFeld.setText(Integer.toString(zahl));        });         root.getChildren().addAll(button, textFeld);        Scene scene = new Scene(root, 200, 100);        primaryStage.setTitle("Eins Hoch");        primaryStage.setScene(scene);        primaryStage.show();    }     public static void main(String[] args) {        launch(args);    }}