JavaFX FXML编辑不同类中的元素

时间:2018-04-29 10:11:10

标签: java javafx-8 fxml

我有一个包含Button s,Label s,TextField等所有元素的FXML文件。对于FXML文件,我有一个控制器类,我可以在其中设置Label s的文本,等等。

现在我有一个extern课程,我需要更改ButtonLabel等。问题是,我无法将元素设置为static。那么如何在不同的班级中改变它们呢?

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

实施例

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);

现在“示例”场景有一个控制器。我需要从第三类访问Controller的元素.. :))

2 个答案:

答案 0 :(得分:0)

您可以将控制器对象传递给 Controller controller = ....; FXMLLoader loader = new FXMLLoader(Resource.onClassPath("MyScene.fxml").getURL()); loader.setController(controller); AnchorPane pane = loader.load(); controller.setTestLabel("This is a test."); 的实例,而不是让FXMLoader必须构建您的控制器类。这允许您将控制器实例传递给其他对象,然后该对象可以调用控制器的方法来执行他们需要的任何操作。

for member in Member.objects.all():
      stat = MatchResult.objects.filter(member__id=member.id).aggregate(Avg('wins'))['wins__avg']

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

答案 1 :(得分:0)

假设您MySceneControllerMyScene.fxmlExampleControllerExample.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);