gpt4 book ai didi

java - 使用 JavaFX 打开多个窗口

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:47:03 24 4
gpt4 key购买 nike

我正在尝试使用 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"/>

然后在我的 Controller 类中我有这个方法:

@FXML
private void sendChat() {
System.out.println("test");
}

但是 Intellij 告诉我的;没有为顶级元素指定 Controller

所以,我的问题是:我是否需要创建多个 Controller 类,或者我可以只为多个窗口使用一个 Controller 类吗?

最佳答案

推荐的方法是为每个 FXML 定义一个 Controller 。由于 Controller 非常轻量级,因此不会增加太多开销。 main.fxml 文件的 Controller 可能很简单

import javafx.fxml.FXML ;

public class MainController {
@FXML
private void sendChat() {
// ...
}
}

我已经在单个项目中对相当多的 FXML 文件和相应的 Controller 使用了这种方法,并且在管理代码等方面没有遇到任何问题。我建议使用 Main.fxml <-> MainController 形式的命名约定。 .

如果您的 Controller 需要共享数据,请使用 Passing Parameters JavaFX FXML 中概述的技术

正如@Vertex 在评论中指出的那样,FXMLLoader.setController(...) 提供了另一种方法方法。所以在你上面的例子中,你可以做

@FXML
private void joinAction() {
Parent root;
try {
Stage stage = (Stage) joinButton.getScene().getWindow();
stage.close();

FXMLLoader loader = new FXMLLoader (getClass().getResource("main.fxml"));
loader.setController(this);
root = loader.load();
stage = new Stage();
stage.setTitle("TuneUs");
stage.setScene(new Scene(root));
stage.show();

} catch (IOException e) {e.printStackTrace();}
}

@FXML
private void sendChat() {
// ...
}

如果您没有通过 FXML 注入(inject)设置任何字段(控件)(即在 fxml 中使用 fx:id 属性并在 Controller 中使用相应的 @FXML 注释),则此方法很好。如果是,将很难跟踪这些字段的设置时间。此外,如果您的 joinAction处理程序被多次调用,您将拥有由 main.fxml 创建的节点的多个实例,但所有实例都共享一个 Controller 实例(并因此覆盖相同的注入(inject)字段)。另请注意,使用这种方法,您的 initialize()方法将在加载原始 fxml 文件时同时调用,在加载 main.fxml 文件时调用,这几乎肯定会导致不良影响。

最后一点:如果您有很多 FXML 文件和相应的 Controller ,您可能需要查看 afterburner.fx framework .这是一个非常轻量级的框架,它强制对 FXML 文件及其相应的 Controller 进行命名约定,并且还提供了一种(非常)简单的机制来在它们之间共享数据。

关于java - 使用 JavaFX 打开多个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com