gpt4 book ai didi

所有类中对 Controller 的 Java FXML 引用

转载 作者:行者123 更新时间:2023-12-02 12:04:57 26 4
gpt4 key购买 nike

我有我的 MainView 类,它是启动整个程序的类。

public class MainView extends Application {
@Override
public void start(Stage stage) throws IOException {
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});

FXMLLoader loader = new FXMLLoader(getClass().getResource("NavigationView.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
stage.setResizable(false);
stage.setScene(scene);
stage.show();
stage.setTitle("Greenhouse");
}

/**
* @param args the command line arguments
* @throws java.sql.SQLException
*/
public static void main(String[] args) throws SQLException {
launch(args);
}

}

这个类加载我的 FXML 并启动程序,正如您可能知道的那样。 Controller 在 FXML 内指定。现在我想要的是能够从程序中的任何类引用该 Controller 。这是因为我希望每个类中的所有 System.out.prints 都打印到 Controller 中的 TextArea 中。这是我的 Controller 中的 TextArea:

@FXML
private TextArea GUIprint;

所以我的问题是,如何正确引用我的 Controller ,以便我可以在所有类中使用它?我知道仅在其他类中创建 Controller 实例只会给我一个 NullPointerException

如果您需要在我的 Controller 中查看我的 Initialize 方法,就在这里,它只是告诉启动时哪个 Pane 可见:

@Override
public void initialize(URL url, ResourceBundle rb) {
loginPane.setVisible(true);

}

最佳答案

您的问题非常不清楚,因为您引用了“其他类”,但绝对没有说明这些类是什么,或者在哪里实例化它们。无论如何我都会尝试回答,涵盖所有可能性。

由于 start() 方法是整个应用程序的入口点,因此您可以创建任何其他对象的唯一位置是:

  1. 在 Controller 本身中,无论是在 initialize() 方法中,还是在事件处理程序中
  2. start() 方法中
  3. 来自您在 1. 或 2. 中创建的对象,或者来自您根据这些等创建的对象。

如果您在 Controller 本身中创建其他对象,那么您只需传递对它们的引用,例如

@FXML
private void someHandlerMethod(ActionEvent event) {
SomeOtherClass someObject = new SomeOtherClass();
someObject.setController(this);
// ...
}

如果您在 start() 方法中创建其他对象,则可以从 FXMLLoader 获取 Controller 实例,并将其传递给其他对象:

public void start(Stage stage) throws IOException {
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent t) {
Platform.exit();
System.exit(0);
}
});

FXMLLoader loader = new FXMLLoader(getClass().getResource("NavigationView.fxml"));
Parent root = loader.load();

MyController controller = loader.getController();
SomeOtherClass someOtherObject = new SomeOtherClass();
someOtherObject.setController(controller);

Scene scene = new Scene(root);
stage.setResizable(false);
stage.setScene(scene);
stage.show();
stage.setTitle("Greenhouse");
}

无论哪种情况,只需在其他类中定义适当的 setter 方法即可:

public class SomeOtherClass {

private MyController controller ;

public void setController(MyController controller) {
this.controller = controller ;
}

// ...
}

在第三种情况下,你可以递归地做同样的事情;将 Controller 引用传递给一个对象,然后将其从该对象传递给任何需要它的人,等等。

更简洁的方法可能是使用 MVC 方法,并与所有 Controller 和其他需要修改应用程序状态的对象共享模型实例。或许看看,Applying MVC With JavaFx 。对于中等复杂的应用程序,您可能需要考虑依赖注入(inject)框架,例如 afterburner.fx (这是特定于 JavaFX 的)或 Spring 或 Guice(不是特定于 JavaFX 的),以便更容易地将模型“注入(inject)”到需要的地方。

关于所有类中对 Controller 的 Java FXML 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958457/

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