如何在JavaFX中传递参数

时间:2015-05-25 22:35:37

标签: java javafx controller fxml

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

我用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(变量和setter):

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(客户端); 问题是输出是空的,那么,为什么会发生这种情况以及如何解决它?

1 个答案:

答案 0 :(得分: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或您的代码中的其他位置有错误。