java - 如何在 JavaFx 中将数据从一个场景传输到另一个场景?

标签 java javafx-8

JavaFX

我正在使用 JavaFX 创建我的第一个 GUI,但在从第一个场景的两个文本字段中获取用户输入并将其传输到下一个场景时遇到问题。我要求提供用户名,并希望在按下提交后将他们的输入放入下一个场景的标签中。 .getText() 似乎不起作用,因为它说我的变量是 NULL。我确信这是一件非常简单的事情,我只是忽视了它或认真思考它。 这是我的应用程序的示例代码。

public class TitleScreen extends Application {
Stage window;
Button button;
Button clearButton;
Button bButton, vButton, dButton;
Button backButton, completeButton;
Scene scene, scene1, scene2, scene3;
String first, last;
public static void main(String[] args){
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    window = primaryStage;
    window.setTitle("Flight Assistant");

    /*window.setOnCloseRequest(e -> {
        e.consume();
        closeProgram();
    });*/

    /*
    First scene will ask the User for their name to take that input and place it in the Title
     */
    //Creating a GridPane container
    GridPane grid = new GridPane();
    grid.setPadding(new Insets(10, 10, 10, 10));
    grid.setVgap(5);
    grid.setHgap(5);

    //Defining the Name text field
    final TextField firstName = new TextField();
    firstName.setPromptText("Enter your first name.");
    firstName.setPrefColumnCount(10);
    first = firstName.getText();
    GridPane.setConstraints(firstName, 0, 0);
    grid.getChildren().add(firstName);

    //Defining the Last Name text field
    final TextField lastName = new TextField();
    lastName.setPromptText("Enter your last name.");
    last = lastName.getText();
    GridPane.setConstraints(lastName, 0, 1);
    grid.getChildren().add(lastName);

    //Defining the Submit button
    Button submit = new Button("Submit");
    submit.setOnAction(e-> window.setScene(scene1));
    GridPane.setConstraints(submit, 1, 0);
    grid.getChildren().add(submit);

    //Defining the Clear button
    clearButton = new Button("Clear");
    GridPane.setConstraints(clearButton, 1, 1);
    grid.getChildren().add(clearButton);

    scene = new Scene(grid, 300, 150);

    //Title of scene1
    Label title = new Label();
    title.setText("Welcome " + first + " " + last +" to Flight Assistance!");
    title.setFont(Font.font("Times New Roman", 38));

    //button showing pending request
    button = new Button();
    button.setText("Pending request");
    //switch to scene 2
    button.setOnAction(e -> window.setScene(scene2));

    //Layout 1 and adding elements to the layout
    VBox layout1 = new VBox(200);
    layout1.getChildren().addAll(title, button);
    layout1.setAlignment(Pos.CENTER);

    //setting the layout size for the first scene
    scene1 = new Scene(layout1, 900, 650);

我还尝试将 String first = firstName.getText(); 放置在按钮的事件处理程序中,但它给了我一个 var 从未出现过的错误已被使用。

最佳答案

您在加载 && 上创建第二个场景并获取值,这是您可以做的两件事。 1)您可以创建场景 onSubmit 并获取设置为字段的值 2)在加载时创建场景,但在提交时设置值并在提交中设置标签

第一个解决方案

public class TitleScreen extends Application {
Stage window;
Button button;
Button clearButton;
Button bButton, vButton, dButton;
Button backButton, completeButton;
Scene scene, scene1, scene2, scene3;
String first, last;

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

@Override
public void start(Stage primaryStage) throws Exception {
    window = primaryStage;
    window.setTitle("Flight Assistant");

    /*
     * window.setOnCloseRequest(e -> { e.consume(); closeProgram(); });
     */

    /*
     * First scene will ask the User for their name to take that input and
     * place it in the Title
     */
    // Creating a GridPane container
    GridPane grid = new GridPane();
    grid.setPadding(new Insets(10, 10, 10, 10));
    grid.setVgap(5);
    grid.setHgap(5);

    // Defining the Name text field
    final TextField firstName = new TextField();
    firstName.setPromptText("Enter your first name.");
    firstName.setPrefColumnCount(10);

    GridPane.setConstraints(firstName, 0, 0);
    grid.getChildren().add(firstName);

    // Defining the Last Name text field
    final TextField lastName = new TextField();
    lastName.setPromptText("Enter your last name.");

    GridPane.setConstraints(lastName, 0, 1);
    grid.getChildren().add(lastName);

    // Defining the Submit button
    Button submit = new Button("Submit");
    submit.setOnAction(e -> {
        first = firstName.getText();
        last = lastName.getText();
        createNewScene();
    });
    GridPane.setConstraints(submit, 1, 0);
    grid.getChildren().add(submit);

    // Defining the Clear button
    clearButton = new Button("Clear");
    GridPane.setConstraints(clearButton, 1, 1);
    grid.getChildren().add(clearButton);
    scene = new Scene(grid, 300, 150);
    primaryStage.setScene(scene);
    primaryStage.show();

}

public void createNewScene() {
    Label title = new Label();
    title.setText("Welcome " + first + " " + last + " to Flight Assistance!");
    title.setFont(Font.font("Times New Roman", 38));

    // button showing pending request
    button = new Button();
    button.setText("Pending request");
    // switch to scene 2
    button.setOnAction(e -> window.setScene(scene2));

    // Layout 1 and adding elements to the layout
    VBox layout1 = new VBox(200);
    layout1.getChildren().addAll(title, button);
    layout1.setAlignment(Pos.CENTER);

    // setting the layout size for the first scene
    scene1 = new Scene(layout1, 900, 650);
    window.setScene(scene1);
 }
 }

第二种解决方案

public class ThreeStages extends Application {
Stage window;
Button button;
Button clearButton;
Button bButton, vButton, dButton;
Button backButton, completeButton;
Scene scene, scene1, scene2, scene3;
String first, last;

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

@Override
public void start(Stage primaryStage) throws Exception {
    window = primaryStage;
    window.setTitle("Flight Assistant");

    /*
     * window.setOnCloseRequest(e -> { e.consume(); closeProgram(); });
     */

    /*
     * First scene will ask the User for their name to take that input and
     * place it in the Title
     */
    // Creating a GridPane container
    GridPane grid = new GridPane();
    grid.setPadding(new Insets(10, 10, 10, 10));
    grid.setVgap(5);
    grid.setHgap(5);

    // Defining the Name text field
    final TextField firstName = new TextField();
    firstName.setPromptText("Enter your first name.");
    firstName.setPrefColumnCount(10);

    GridPane.setConstraints(firstName, 0, 0);
    grid.getChildren().add(firstName);

    // Defining the Last Name text field
    final TextField lastName = new TextField();
    lastName.setPromptText("Enter your last name.");

    GridPane.setConstraints(lastName, 0, 1);
    grid.getChildren().add(lastName);

    // Defining the Submit button
    Button submit = new Button("Submit");
    Label title = new Label();
    submit.setOnAction(e -> {
        first = firstName.getText();
        last = lastName.getText();
        title.setText("Welcome " + first + " " + last + " to Flight Assistance!");
        window.setScene(scene1);
    });
    GridPane.setConstraints(submit, 1, 0);
    grid.getChildren().add(submit);

    // Defining the Clear button
    clearButton = new Button("Clear");
    GridPane.setConstraints(clearButton, 1, 1);
    grid.getChildren().add(clearButton);

    scene = new Scene(grid, 300, 150);
    primaryStage.setScene(scene);
    primaryStage.show();
    // Title of scene1

    title.setFont(Font.font("Times New Roman", 38));

    // button showing pending request
    button = new Button();
    button.setText("Pending request");
    // switch to scene 2
    button.setOnAction(e -> window.setScene(scene2));

    // Layout 1 and adding elements to the layout
    VBox layout1 = new VBox(200);
    layout1.getChildren().addAll(title, button);
    layout1.setAlignment(Pos.CENTER);

    // setting the layout size for the first scene
    scene1 = new Scene(layout1, 900, 650);

  }
}

我希望这对你有帮助。我测试过它可以工作

关于java - 如何在 JavaFx 中将数据从一个场景传输到另一个场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940574/

相关文章:

java - 如果 GUI 是在构造函数中定义的,如何添加或删除 jtable?

java - 如何在android上正确使用mvc?

java - 使用 java.nio.file.Files.createTempDirectory 时出现 NoSuchFileException

JavaFX observableList 作为 Map 中的值

java - 如何修复编写代码检查 UPC 是否有效的 java 运行时错误?

java - 如何迭代由 GSON 生成的 JAVA 对象列表

javafx - 警报和阶段焦点

java - 为什么在 javafx 的 listview.cellFacoty 方法中调用 super.updateItem(item, empty)?

带按钮的 JavaFX-8 TableView 渲染了太多按钮?

JavaFX 将事件监听器附加到黑色圆圈