2015-09-29 4 views
1

У меня есть два файла fxml. Я соединить их с include заявлением:Впрыск контроллера JavaFX не работает

"Основной" fxml файл выглядит следующим образом:

<?import javafx.geometry.*?> 
// ... 

<BorderPane prefHeight="962" prefWidth="1280" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyMainController"> 
    <center> 
     <SplitPane dividerPositions="0.63" BorderPane.alignment="CENTER"> 
      <items> 
       <fx:include source="AnotherFile.fxml" /> 
       // ... 
      </items> 
     </SplitPane> 
    </center> 
    <top> 
     // ... 
    </top> 
</BorderPane> 

И второй (= "AnotherFile.fxml") так:

<?import java.lang.*?> 
// ... 

<SplitPane dividerPositions="0.15" orientation="VERTICAL" prefHeight="400.0" prefWidth="500.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"> 
    <items> 
     // ... 
     <Label fx:id="oneOfMyLabels" text="myText" GridPane.columnIndex="2" GridPane.rowIndex="1" /> 
    </items> 
</SplitPane> 

Теперь я использую инъекции в "основной" -controller application.MyMainController:

@FXML 
private Label oneOfMyLabels; 

Если я запускаю контроллер, я получаю исключение java.lang.NullPointerException, соответственно java.lang.reflect.InvocationTargetException. В режиме отладки выяснилось, что введенный Label - null!

Теперь, мой вопрос: Не удается связаться с MyMainController из файла "main fxml" в составе прилагаемого файла fxml? Должен ли я использовать собственный контроллер для каждого файла fxml, если он включен или нет?

Спасибо за помощь!

ответ

4

Для каждого файла FXML необходим отдельный контроллер, а нулевые элементы каждого файла будут вставляться в соответствующий экземпляр контроллера.

Когда вы включили FXML файлы, вы можете вводить контроллер для включаемого файла в контроллер для включая файл, установив атрибут fx:id на fx:include элемент:

«основного» файла FXML:

<?import javafx.geometry.*?> 
// ... 

<BorderPane prefHeight="962" prefWidth="1280" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MyMainController"> 
    <center> 
     <SplitPane dividerPositions="0.63" BorderPane.alignment="CENTER"> 
      <items> 
       <fx:include fx:id="another" source="AnotherFile.fxml" /> 
       // ... 
      </items> 
     </SplitPane> 
    </center> 
    <top> 
     // ... 
    </top> 
</BorderPane> 

и в «основной контроллер»:

public class MyMainController { 

    @FXML 
    private AnotherController anotherController ; 

    // ... 
} 

(правило в том, что имя поля является значением го e fx:id с добавлением "Controller"). Здесь AnotherController - это класс контроллера для AnotherFile.fxml.

Теперь вы можете, например, подвергать данные вам необходимо получить доступ в «включен контроллер»:

public class AnotherController { 

    @FXML 
    private Label oneOfMyLabels ; 

    public StringProperty textProperty() { 
     return oneOfMyLabels.textProperty(); 
    } 

    public final String getText() { 
     return textProperty().get(); 
    } 

    public final setText(String text) { 
     textProperty().set(text); 
    } 

    // ... 
} 

, а затем ваш главный контроллер может делать вещи, как

anotherController.setText(...); 

который, конечно же, обновит ярлык. Это сохраняет инкапсуляцию, поэтому, если вы решите использовать другой элемент управления вместо метки, эти изменения не должны распространяться вне непосредственного контроллера.

+0

Следует помнить, что корневой элемент включенного файла fxml должен содержать собственный атрибут fx: controller! – mrbela

+0

Есть ли возможность вставить «MyMainController» в 'AnotherController'? Мне нужно вызвать метод в основном контроллере из дополнительного контроллера ... – mrbela

Смежные вопросы