JavaFX FXML 编辑不同的元素 Class

JavaFX FXML edit Elements in different Class

我有一个 FXML 文件,其中包含 Buttons、Labels、TextFields 等所有元素。对于 FXML 文件,我有一个控制器 class, 在这里我可以设置 Labels 等的文本。

现在我有一个 extern class,我也需要更改 Buttons、Labels 等。问题是,我无法将元素设置为 static。那么我怎样才能将它们更改为不同的 class?

我已经知道这里有类似的问题,但没有什么能真正帮助我。非常感谢您的帮助。

例子

FXML

<AnchorPane fx:id="root" prefHeight="1000" prefWidth="1000"
    xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1"
    fx:controller="Controller">
    <Label fx:id="testLabel" layoutX="150" layoutY="200" text=""/>

Controller.java

@FXML private Label testLabel;

AnotherClass.java

testLabel.setText("This is a test");

Main.java

Main.primaryStage = primaryStage;
primaryStage.setTitle("Test Scene");
AnchorPane pane = FXMLLoader.load(Resource.onClassPath("MyScene.fxml").getURL());
Scene scene = new Scene(pane);
primaryStage.setScene(scene);

如果我在场景中 "MyScene.fxml" 并单击按钮导航到下一个场景

@FXML AnchorPane root;
    AnchorPane pane = FXMLLoader.load(Resource.onClassPath("Example.fxml").getURL());
    root.getChildren().setAll(pane);

现在 "Example" 场景有一个控制器。我需要从第三个 Class.. 访问控制器的元素 :)

不必让 FXMLLoader 构造您的控制器 class,您可以将控制器对象传递给 FXMLLoader 的实例。这允许您将控制器实例传递给其他对象,然后对象可以调用控制器的方法来执行他们需要的任何操作。

  Controller controller = ....;
  FXMLLoader loader = new FXMLLoader(Resource.onClassPath("MyScene.fxml").getURL());
  loader.setController(controller);
  AnchorPane pane = loader.load();

  controller.setTestLabel("This is a test.");

但是,我建议创建一个域模型并将该域模型传递给您的控制器实例,并让它将用户界面元素绑定到域模型元素。

假设您有 MySceneController 对应 MyScene.fxmlExampleController 对应 Example.fxml

当点击 MyScene 中的某个按钮时,您可以像这样访问 ExampleController

    FXMLLoader loader = new FXMLLoader(getClass().getResource("Example.fxml"));

    AnchorPane pane = loader.load();
    ExampleController exampleController = loader.getController();

    exampleController.getLabel().setText("hello"); // if you have corresponding getters for element

    // or if element is public
    exampleController.label.setText("hello");

    // similary you can pass exampleController to other class and access its element in the other class (as you asked in question)
    new OtherClass(exampleController);

    root.getChildren().setAll(pane);