2016-03-03 6 views
0

Когда я пытаюсь использовать контроллер, который я ввел в мой главный контроллер, я всегда получаю исключение Nullpointer (widgetlinebelowtableController равно null). Я видел этот ответ, но не помогло: JavaFX controller injection does not workJavafx Injected Controller is null

впрыскивается FXML:

<HBox fx:id="widgetLineBelowTable" maxWidth="Infinity" spacing="5.0" xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.widgets.WidgetLineBelowTableController"> 
     <padding> 
      <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" /> 
     </padding> 
     <Label fx:id="warningLabel" text="Overflow"/> 
    </HBox> 

Контроллер для этого FXML:

public class WidgetLineBelowTableController 
    { 
    @FXML 
    Label warningLabel; 

    public void setColor(int r, int g, int b) { 
     warningLabel.setTextFill(Color.rgb(r,g,b)); 
    } 

} 

Мой главный FXML:

<VBox xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" stylesheets="/sample/style.css" fx:controller="sample.mainController"> 
    <fx:include source="/sample/menubar/MenuBar.fxml"/> 
    <TabPane> 

     <tabs> 
      <Tab closable="false" text="FirstTab"> 
       <VBox> 
        <TitledPane collapsible="false"> 
         <text>Results</text> 
         <fx:include source="table/Table.fxml"/> 
        </TitledPane> 
        <fx:include fx:id="widgetlinebelowtable" source="widgets/WidgetLineBelowTable.fxml" /> 
       </VBox> 
      </Tab> 
      <Tab closable="false" text="SecondTab"> 

      </Tab> 
     </tabs> 
    </TabPane> 
</VBox> 

Основной контроллер:

import sample.widgets.WidgetLineBelowTableController; 

public class mainController { 

    @FXML 
    private WidgetLineBelowTableController widgetlinebelowtableController; 

    public mainController() { 
     widgetlinebelowtableController.setColor(255,0,0); 
    } 

} 

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

ответ

1

Вы пытаетесь получить доступ к введенному полю в конструкторе, который, очевидно, не будет работать (поскольку FXMLLoader не может вводить ничего до тех пор, пока контроллер не будет создан, то есть после выполнения конструктора).

Перемещение кода в initialize() метода:

public class MainController { 

    @FXML 
    private WidgetLineBelowTableController widgetlinebelowtableController; 

    public void initialize() { 
     widgetlinebelowtableController.setColor(255,0,0); 
    } 

} 

Кроме того, пожалуйста, следуйте стандартным naming conventions

+0

Спасибо, мой плохой – Joey