JavaFX FXML редактировать элементы в другом классе - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть файл FXML со всеми элементами, такими как Button s, Label s, TextField s и т. Д. Для FXML-файла у меня есть класс контроллера, где я могу установить текст Label и т. д.

Теперь у меня есть внешний класс, где мне нужно изменить Button s, Label s и т. Д. Проблема в том, что я не могу установить элементы на 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);

Теперь сцена "Пример" имеет контроллер. Мне нужно получить доступ к элементам контроллера из третьего класса ..:)

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Предположим, у вас есть 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);
0 голосов
/ 29 апреля 2018

Вместо того, чтобы FXMLoader создавал ваш класс контроллера, вы можете передать объект контроллера экземпляру 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.");

Однако я бы посоветовал создать модель домена и передать эту модель домена вашему экземпляру контроллера, чтобы он связывал элементы пользовательского интерфейса с элементами модели домена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...