【问题标题】:How to pass arguments in JavaFX如何在 JavaFX 中传递参数
【发布时间】:2015-05-25 22:35:37
【问题描述】:

所以,这有点令人困惑,但事情是这样的:

我用 SceneBuilder 创建了一个窗口,并创建了控制器和所有东西,窗口中有一个按钮。 按钮 setOnAction() 方法使程序打开另一个窗口,问题是,另一个窗口是另一个类,我想将信息传递给另一个窗口,但似乎我不能。下面是一些代码示例:

主窗口:

confirm.setOnAction(event->{
    try {
        LibraryWindowController lwc = new LibraryWindowController();
        lwc.setDay(day.getValue());
        lwc.setMonth(month.getValue());
        lwc.setYear(Integer.parseInt(year.getText()));
        lwc.setClient(login.getText());
        lwc.start(new Stage());
    } catch (Exception e) {
        System.out.println("An error has occured!");
    }
});

LibraryWindowController(变量和设置器):

private int day, month, year;
private String client;

public void setDay(int day){
    this.day = day;
}

public void setMonth(int month){
    this.month = month;
}

public void setYear(int year){
    this.year = year;
}

public void setClient(String login){
    this.client = login;
}

问题是,在 Controller 的初始化方法中有一个 System.out.println(client); 问题是输出为空,那么,为什么会发生这种情况以及如何解决?

【问题讨论】:

    标签: java javafx controller fxml


    【解决方案1】:

    我建议您使用fx:root 构造来防止此类问题。我发现它对构建你的应用程序有很大帮助。它在FXML docs 的自定义组件部分进行了描述。如果您使用这种方法,那么您的所有屏幕/窗格都是 JavaFX 中某个 Pane 类的简单子类。而且由于 FXML 加载被封装在类中,您可以简单地使用构造函数来创建新实例(请参阅我链接到的文档中的示例)并像设置任何对象一样设置它们。

    例如(假设 MyPane 是您使用这种方法设计的窗格):

    MyPane mp = new MyPane();
    mp.setWhatever(whatever);
    Stage newWindow = new Stage();
    newWindow.setScene(new Scene(mp));
    newWindow.show();
    

    您只需在 SceneBuilder 中进行更改就是删除您的控制器类(您不再需要它,MyPane 类本身成为控制器)并选中“使用 fx:root”复选框。

    有关如何使用fx:root 的完整示例,请参阅我为我的学生制作的this example。它带有完整的源代码(在 GitHub 上)。

    关于您的代码:您将 LibraryWindowController 称为控制器,但从外观上看,我认为它是一个应用程序?您无需创建单独的应用程序即可创建多个窗口。只需使用场景和根节点创建一个新阶段。但是,即使不推荐,您使用的步骤也应该有效。我猜login.getText() 要么返回 null,要么你的代码中的其他地方有错误。

    【讨论】:

    • 所以,在这个项目之后,我将尝试使用你提到的 fx:root 构造,但是虽然我不是,你能解释一下为什么 login.getText() 返回 null 吗?我真的很想修复这段代码,不知道如何。
    • 我也尝试将 mainStage 从 MainWindow 传递到 LibraryWindow,但它引发了异常。还尝试将参数传递给 LibraryWindow 类的构造函数。
    • 如果 login.getText() 返回 null,那是你的错;)很可能文本尚未设置。
    • login是一个TextField,getText()只有在if()验证不等于("")之后才能访问,也就是说不应该为null
    • null 和 "" 不一样。 "" 是一个空字符串,但仍然是一个字符串。 null 是 null 并且根据定义永远不等于任何东西。
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多