2013-03-21 4 views
3

Можно ли добавить два контроллера (fx:controller="") в один файл FXML?fx: controller = "" in .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"> 
+0

Невозможно. Если вы можете объяснить, почему вам нужно добавить два контроллера, возможно, мы сможем найти другое решение. – mcaaltuntas

+0

У меня есть четыре файла ... 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' – Perco

+0

@JacksonMireski Только что обновил мой ответ, надеюсь, что помощь. – tarrsalah

ответ

1

Вы не можете установить более одного контроллера в файле 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(); 
0

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