JavaFX - Aufgabe

Neue Frage »

Auf diesen Beitrag antworten »
Michael90 JavaFX - Aufgabe

Meine Frage:
Hey Leute,

ihr müsst mir mal bitte mit JavaFX weiterhelfen :-)

Die Aufgabe:

Realisieren Sie ein Fenster, mit dem ein Anwender die folgenden Daten für eine Person eingeben kann:
Vorname,
Name,
Alter,
Geschlecht
Außerdem sollen die beiden Button OK und Abbrechen vorhanden sein

Eine Grafik, wie ich es mir vorstelle, befindet sich im Anhang.

Meine Ideen:
Was habe ich bisher herausgefunden:

Das Hello-World-Programm habe ich mir heruntergeladen und es läuft auch.

1) Es muss anscheinend eine Art Gitter erstellt werden.

code:
1:
2:
3:
4:
5:
6:
7:
8:
GridPane grid = new GridPane();
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets (10,20,10,20);
// Button erstellen mit 
JButton btn = new JButton ("Button);


Dann werden noch Label (Anzeige von Text) und Textfield (Eingabemöglichkeit) benötigt.

Aber wie verpacke ich das jetzt alles in einen Code?


Vielen Dank für Eure Hilfe :-)
 
Auf diesen Beitrag antworten »
Michael90

Hier noch das Bild :-)
Auf diesen Beitrag antworten »
Karlito

Hallo Michael90,

Du musst die Elemente erzeugen und dann dem Grid hinzufügen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
        Label lName = new Label("Name");
        grid.add(lName, 0, 0);

        TextField tfName = new TextField();
        grid.add(tfName, 1, 0);

        Label lVorname = new Label("Vorname");
        grid.add(lVorname, 0, 1);

        TextField tfVorname = new TextField();
        grid.add(tfVorname, 1, 1);

        Label lAlter = new Label("Alter");
        grid.add(lAlter, 0, 2);

        TextField tfAlter = new TextField();
        grid.add(tfAlter, 1, 2);


Gruß,

Karlito
Auf diesen Beitrag antworten »
Michael90

Vielen Dank für deine Antwort. Habe das Programm jetzt einmal folgendermaßen geschrieben, allerdings sehe ich nur einen Button, und zwar "Abbrechen". Sorry, dass ich hier so ahnungslos bin, aber an der Uni erklärt dir das ja keiner böse

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
    	GridPane grid = new GridPane();
    	grid.setHgap(10);
    	grid.setVgap(10);
    	grid.setPadding(new Insets (10,20,10,20));
    	Label lName = new Label("Name");
        grid.add(lName, 0, 0);

        TextField tfName = new TextField();
        grid.add(tfName, 1, 0);

        Label lVorname = new Label("Vorname");
        grid.add(lVorname, 0, 1);

        TextField tfVorname = new TextField();
        grid.add(tfVorname, 1, 1);

        Label lAlter = new Label("Alter");
        grid.add(lAlter, 0, 2);

        TextField tfAlter = new TextField();
        grid.add(tfAlter, 1, 2);
    	primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("OK");
        btn.setText("Abbrechen");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}
 
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von Michael90
Sorry, dass ich hier so ahnungslos bin, aber an der Uni erklärt dir das ja keiner böse


Uni ist keine Schule. Wenn Du alles erklärt haben willst, mach eine Berufsausbildung und auch da bekommt man nicht alles vorgekaut...

Zitat:
Original von Michael90
code:
1:
2:
3:
4:
5:
        Button btn = new Button();
        btn.setText("OK");
        btn.setText("Abbrechen");



Wenn Du nur einen Button erzeugst ist klar, dass Dir auch nur einer angezeigt wird. Nur weil Du den Text veränderst, erscheint ja nicht gleich ein neuer Button.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Michael90

In keinster Weise soll alles vorgekaut werden, aber einem die Aufgabe hinwerfen und sagen: "Macht mal" nur weil der Prof keinen Bock hat, finde ich schon etwas merkwürdig.

Dann würde die Erstellung meiner zwei Button so aussehen:

code:
1:
2:
3:
4:
 Button btn = new Button();
        btn.setText("OK");
        Button btn1 = new Button();
        btn1.setText("Abbrechen");



Aber warum werden mir auch die Textfelder (Vorname, Name, usw.) nicht angezeigt?
Auf diesen Beitrag antworten »
Karlito

Zitat:
Original von Michael90
In keinster Weise soll alles vorgekaut werden, aber einem die Aufgabe hinwerfen und sagen: "Macht mal" nur weil der Prof keinen Bock hat, finde ich schon etwas merkwürdig.


Ich denke das kann von einem Uni-Studenten erwartet werden. So ist es nunmal im echten Leben und gerade in höheren Positionen. Man muss sich selbst kümmern, wie man eine Aufgabe bewältigt. Das bringt einem in der Schule nur leider niemand bei...

Zitat:
Original von Michael90
Dann würde die Erstellung meiner zwei Button so aussehen:

code:
1:
2:
3:
4:
 Button btn = new Button();
        btn.setText("OK");
        Button btn1 = new Button();
        btn1.setText("Abbrechen");



Passt.

Zitat:
Original von Michael90
Aber warum werden mir auch die Textfelder (Vorname, Name, usw.) nicht angezeigt?


Weil Du ein Stackpane einführst und dies verwendest anstatt des Grids, mit dem die Elemente die Du sehen willst verknüpft sind.

Guckst Du hier:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(10,20,10,20));
        Label lName = new Label("Name");
        grid.add(lName, 0, 0);

        TextField tfName = new TextField();
        grid.add(tfName, 1, 0);

        Label lVorname = new Label("Vorname");
        grid.add(lVorname, 0, 1);

        TextField tfVorname = new TextField();
        grid.add(tfVorname, 1, 1);

        Label lAlter = new Label("Alter");
        grid.add(lAlter, 0, 2);

        TextField tfAlter = new TextField();
        grid.add(tfAlter, 1, 2);
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("OK");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });

        Button btn1 = new Button();
        btn1.setText("Abbrechen");

        /*StackPane root = new StackPane();
        root.getChildren().add(btn);
        */
        grid.add(btn, 0, 3);
        grid.add(btn1, 1, 3);


        primaryStage.setScene(new Scene(grid, 300, 250));
        primaryStage.show();
    }
}


Gruß,

Karlito
Auf diesen Beitrag antworten »
Michael90

Ich danke dir :-) Jetzt habe ich was, woran ich mich orientieren kann.
Auf diesen Beitrag antworten »
Michael90

Hi Karlito,

eine Frage hätte ich zu dem Thema noch.

Die folgende Zeile wirft ein paar Fragen auf:


grid.setPadding(new Insets(10,20,10,20));

Der erste Wert gibt mir den Abstand von oben im Gitter an, der letzte den Abstand von der linken Seite. Aber was für einen Sinn haben die mittleren beiden Werte. Die kann ich nach Belieben umändern, sehe aber keine Veränderungen in meinem Fenster verwirrt


Vielen Dank für deine Antwort.
Auf diesen Beitrag antworten »
Karlito

Hallo Michael90,

es sind die Abstände nach rechts und nach unten.

Siehe hier.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Michael90

Vielen Dank für die Antwort. Jetzt ist mir noch etwas aufgefallen.

Wenn ich die eingegebenen Daten der Textfelder ausgeben will, dachte ich mir halt, versuche es mal mit:

code:
1:
2:
3:
4:
5:
@Override
            public void handle(ActionEvent event) 
            {
            System.out.println(lName);   
            }


Da bekomme ich aber dann die Fehlermeldung:

code:
1:
[email protected][styleClass=label]'Name'



Ok, dann versuche ich es halt über eine Hilfsmethode, klappte leider auch nicht.

Wo liegt denn da mein Fehler?
Auf diesen Beitrag antworten »
Karlito

Hallo Michael90,

das ist keine Fehlermeldung. Wenn Du
code:
1:
System.out.println(lName);

aufrufst, wird bei lName implizit
code:
1:
lName.toString()


aufgerufen. Was Du willst ist
code:
1:
System.out.println(lName.getText());


Wobei ich annehme, dass Du eigentlich nicht die Beschriftung des Labels haben möchtest sondern den aktuellen Wert des Textfeldes, also

code:
1:
System.out.println(tfName.getText());


Gruß,

Karlito
Auf diesen Beitrag antworten »
Michael90

Zitat:
Wobei ich annehme, dass Du eigentlich nicht die Beschriftung des Labels haben möchtest sondern den aktuellen Wert des Textfeldes


Genau das habe ich gesucht :-)

Vielen Dank Daumen hoch Daumen hoch
Auf diesen Beitrag antworten »
Tina92

Auch ich hänge gerade an diesem Thema und habe mir jetzt einmal ein paar Sachen erarbeitet. Könntest du bitte einen Blick darauf werfen, ob das so richtig ist?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage; // Eclipse implemetiert die import - Anweisungen automatisch, aber woher weiß ich diese, wenn 
// ich die Aufgabe auf Papier schreiben muss? 
 
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) { // Gibt den Einstiegspunkt an
        primaryStage.setTitle("Hello World!"); // Titel des Fenster's wird ausgegeben
        Button btn = new Button(); // Button-Objekt wird erzeugt
        btn.setText("Say 'Hello World'"); // Button - Objekt wird angesprochen und mit setText erfolgt Ausgabe
        btn.setOnAction(new EventHandler<ActionEvent>() { // EventHandler ist verantwortlich für die Ausgabe bzw.
        	// Ausführung, wenn der Button gedrückt wird? 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();  // Stack bedeutet Stapel, eventuell um mehrere Fenster übereinander zu lagern
        root.getChildren().add(btn); // Die Zeile ist mir ein Rätsel
        primaryStage.setScene(new Scene(root, 300, 250));	// Muss für die Größe des Fensters zuständig sein
        primaryStage.show(); // wird zur Ausgabe benötigt!
    }
}
Auf diesen Beitrag antworten »
Karlito

Sieht soweit ganz gut aus. Funktionier auch bei mir. Habe es mit IntelliJ getestet. Das ist für Studenten kostenfrei nutzbar. Eclipse habe ich für JavaFX noch nicht probiert.

Wie das mit den imports geregelt ist, musst Du deinen Dozenten fragen. Darüber kann ich keine Aussage machen.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Tina92

Vielen Dank für deine Antwort. Eine Frage habe ich noch: Ich schreibe ja die ganze Zeit meine Programme in einer IDE (Eclipse, usw.). Das heißt, dass ich die Ausgabe meines Programmes auch nur innerhalb der IDE sehen kann. Wenn ich aber jetzt ein Programm schreibe und möchte das einem Freund für seinen PC geben, wie geht das dann?
Auf diesen Beitrag antworten »
Karlito

Schau dir mal die Export Funktion an. Da als jar exportieren. Sollte das nicht funktionieren, melde dich noch mal.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Tina92

Danke für den Tipp. Also auf dem Desktop wird eine .jar - Datei abgelegt, allerdings wird sie bei Doppelklick nicht ausgeführt?
Auf diesen Beitrag antworten »
Karlito

Hast Du export as runnable jar gemacht?

Gruß,

Karlito
Auf diesen Beitrag antworten »
Tina92

Ja, habe ich gemacht :-)
Auf diesen Beitrag antworten »
Karlito

Ich habe es gerade bei mir probiert und es funktionert. Beim export ist wichtig, dass Du die richtige "Launch Configuration" angibst.

Im Anhang findest Du die von mir generierte jar zum ausprobieren. Wenn das nicht geht, musst Du mal sehen, dass Du eventuell eine neue java-runtime installierst.

Gruß,

Karlito
Auf diesen Beitrag antworten »
Tina92

Die von dir generierte jar.Datei funktioniert. Ich werde mich heute Abend einmal intensiver damit befassen und mich gegebenfalls noch mal melden, falls es dann immer noch nicht läuft.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »