JavaFX FXML 编辑不同的元素 Class
JavaFX FXML edit Elements in different Class
我有一个 FXML 文件,其中包含 Button
s、Label
s、TextField
s 等所有元素。对于 FXML 文件,我有一个控制器 class, 在这里我可以设置 Label
s 等的文本。
现在我有一个 extern class,我也需要更改 Button
s、Label
s 等。问题是,我无法将元素设置为 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.fxml
和 ExampleController
对应 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);
我有一个 FXML 文件,其中包含 Button
s、Label
s、TextField
s 等所有元素。对于 FXML 文件,我有一个控制器 class, 在这里我可以设置 Label
s 等的文本。
现在我有一个 extern class,我也需要更改 Button
s、Label
s 等。问题是,我无法将元素设置为 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.fxml
和 ExampleController
对应 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);