【发布时间】:2014-10-19 05:45:37
【问题描述】:
我正在尝试使用 JavaFX 打开多个窗口,我有一个事件监听器,当单击按钮时会打开一个新窗口,如下所示:
@FXML
private void joinAction() {
Parent root;
try {
Stage stage = (Stage) joinButton.getScene().getWindow();
stage.close();
root = FXMLLoader.load(getClass().getResource("main.fxml"));
stage = new Stage();
stage.setTitle("TuneUs");
stage.setScene(new Scene(root));
stage.show();
} catch (IOException e) {e.printStackTrace();}
}
第一个窗口打开,新窗口打开,但我的问题是让事件与我的第二个窗口一起工作
在main.fxml我有这行:
<TextField id="chat_bar" onAction="#sendChat" layoutX="14.0" layoutY="106.0" prefHeight="22.0" prefWidth="403.0"/>
然后在我的控制器类中我有这个方法:
@FXML
private void sendChat() {
System.out.println("test");
}
但 Intellij 告诉我;没有为顶级元素指定控制器
所以,我的问题是:我是否需要创建多个控制器类,或者如果需要,我可以只为多个窗口使用一个吗?
【问题讨论】:
-
为每个 FXML 文件创建一个控制器类(不管你有多少个窗口/阶段)。
-
您可以用 setController 告诉 FXMLLoader 包含事件处理程序方法的控制器在哪里。例如,如果加载器看到
onAction="#sendChat",它将在控制器对象中搜索带有@FXML注释的方法sendChat。 -
@James_D 所以,如果我有很多 FXML 文件,我将不得不为我的控制器准备大量文件
-
@Serial 是的:我从来没有发现这是一个问题。 @Vertex 提供了一种不同的机制,但只能在非常简单的情况下使用(没有注入字段,没有
initialize()方法)。我添加了一个答案。
标签: java events intellij-idea javafx