fx:controller= в .FXML

можно ли добавить два контроллера (fx:controller="") в один файл FXML?

Мне удалось добавить только один как fx:controller=""

Посмотреть код

<BorderPane id="BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="596.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="demoapp.ClientArea">

person Perco    schedule 21.03.2013    source источник
comment
Это невозможно. Если вы можете объяснить, почему вам нужно добавить два контроллера, возможно, мы сможем найти другое решение.   -  person caltuntas    schedule 22.03.2013
comment
У меня есть четыре файла... 2 файла .java (ClientArea.java и Undecorator.java) и 2 файла .fxml (ClientArea.fxml и Undecorator.fxml) ClientArea.fxml имеет fx:controller="" ClientArea.java и Undecorator.fxml имеет fx:controller="" Undecorator.java Я хочу использовать то, что находится в ClientArea.fxml Undecorator.java   -  person Perco    schedule 22.03.2013
comment
@JacksonMireski Только что обновил свой ответ, надеюсь, это поможет.   -  person Salah Eddine Taouririt    schedule 15.04.2013


Ответы (2)


Вы не можете установить более одного контроллера в файле FXML с помощью (fx:controller=""), вместо этого рассмотрите возможность ввода контроллера вручную, в основном есть два способа:

Использование setController без упоминания контроллера внутри файла FXML:

FXMLLoader loader = new FXMLLoader();
URL location = getClass().getClassLoader().getResource("fxml/ClientArea.fxml");
loader.setLocation(location);   
loader.setController(new ClientArea());
// loader.setController(new Undecorator());
loader.load();

Более целесообразно использовать setControllerFactory метод:

сначала убедитесь, что оба контроллера ClientArea и Undecorator реализуют интерфейс (Icontroller, содержащий методы обработчика событий), упомянутый в FXML файле (fx:controller="IController"), затем выберите контроллер при загрузке представления из файла FXML:

FXMLLoader loader= new FXMLLoader();
URL location = getClass().getClassLoader().getResource("fxml/ClientArea.fxml");
loader.setLocation(location);
loader.setControllerFactory(new Callback<Class<?>, Object>() {   
    public Object call(Class<?> p) {
        return new ClientArea(); 
           // return new Undeorator();
    }
});
loader.load();
person Salah Eddine Taouririt    schedule 01.04.2013

Если это соответствует вашему коду, ваш Undecorator.java может расширяться от ClientArea.java. Таким образом, любой метод (или метод/элемент управления FXML) можно использовать из его родителя: ClientArea.java. Использование JavaFX SceneBuilder не покажет вам package.ClientArea в выборе контроллера, но во время выполнения он будет работать.

person Leonardo    schedule 22.03.2013