Получение доступа к элементам пользовательского интерфейса в другом файле fxml - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть FXML-приложение с main.fxml, которое включает в себя два других файла fxml.Каждый из этих файлов fxml имеет свой собственный класс контроллеров.

Мой вопрос заключается в том, как получить доступ к объектам из определенного контроллера, хотя эти объекты определены в другом файле fxml.

Следующий код является лишь минимальным примером.Я подумал, что было бы неплохо разделить элементы пользовательского интерфейса на разные fxml-файлы, потому что они становятся все больше и больше.

Мой основной fxml:

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
   <fx:include fx:id="top" source="top.fxml"/>
   <fx:include fx:id="bottom" source="bottom.fxml"/>
</VBox>

top.fxml:

<VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="ControllerTop">
  <children>
    <Button fx:id="topbtn" onAction="#printOutput" text="OK" />
  </children>
</VBox>

bottom.fxml

<VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="ControllerBottom">
  <children>
    <Button fx:id="bottombtn" onAction="#printOutput" text="OK" />
  </children>
</VBox>

Для top.fxml я создал этот класс контроллера:

public class ControllerTop {
    @FXML public Button topbtn;
    @FXML public Button bottombtn;

    @FXML
    public void printOutput() {
        System.out.println("Hello from top button");
        topbtn.setDisable(true); //OK!
        bottombtn.setDisable(false); //Failed
    }
}

Конечно, botombtn определен в bottom.fxml и имеетсобственный контроллер.Проблема в том, что botombtn printOut () этого ControllerTop приводит к исключению NullPointerException.Поэтому мне нужна помощь, получая доступ к объектам хорошим и умным способом.

Спасибо

1 Ответ

0 голосов
/ 17 февраля 2019

в главном контроллере:

public class MainController {
/**
 * var name has to be topController
 */
public TopController topController;
/**
 * var name has to be bottomController
 */
public BottomController bottomController;

public void initialize(){
    Button topbtn=topController.topbtn;
    Button bottombtn=bottomController.bottombtn;
    topbtn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello from top button");
            topbtn.setDisable(true); //OK!
            bottombtn.setDisable(false); //Failed
        }
    });

}
}

bottom.fxml:

    <VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="BottomController">
  <children>
    <Button fx:id="bottombtn" text="OK" />
  </children>
</VBox>

top.fxml:

 <VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="TopController">
  <children>
    <Button fx:id="topbtn" text="OK" />
  </children>
</VBox>

и в наборе классов TopController и BottomController @FXML public Button **btnName**;

BottomController:

public class BottomController {    
    public Button bottombtn;
}

TopController:

public class TopController {
    public Button topbtn;
}

Другой вариант - использовать initialize при MainController для установки значения bottombtnв topController

...