JavaFX - Aufgabe |
Michael90 unregistriert
|
|
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 :-)
|
|
27.03.2015 00:30 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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
|
|
27.03.2015 07:55 |
|
|
Michael90 unregistriert
|
|
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
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();
}
} |
|
|
|
27.03.2015 08:16 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Zitat: |
Original von Michael90
Sorry, dass ich hier so ahnungslos bin, aber an der Uni erklärt dir das ja keiner
|
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
|
|
27.03.2015 08:33 |
|
|
Michael90 unregistriert
|
|
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?
|
|
27.03.2015 08:38 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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
|
|
27.03.2015 08:55 |
|
|
Michael90 unregistriert
|
|
Ich danke dir :-) Jetzt habe ich was, woran ich mich orientieren kann.
|
|
27.03.2015 09:04 |
|
|
Michael90 unregistriert
|
|
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
Vielen Dank für deine Antwort.
|
|
05.04.2015 21:42 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
Hallo Michael90,
es sind die Abstände nach rechts und nach unten.
Siehe hier.
Gruß,
Karlito
|
|
06.04.2015 11:46 |
|
|
Michael90 unregistriert
|
|
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:
|
Label@45a95[styleClass=label]'Name' |
|
Ok, dann versuche ich es halt über eine Hilfsmethode, klappte leider auch nicht.
Wo liegt denn da mein Fehler?
|
|
06.04.2015 12:10 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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
|
|
06.04.2015 12:21 |
|
|
Michael90 unregistriert
|
|
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
|
|
06.04.2015 12:33 |
|
|
Tina92 unregistriert
|
|
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!
}
} |
|
|
|
13.04.2015 22:36 |
|
|
Karlito
Kaiser
Dabei seit: 11.04.2011
Beiträge: 1.461
|
|
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
|
|
15.04.2015 14:00 |
|
|
|