JavaFX controller injection does not work

后端 未结 1 755
情话喂你
情话喂你 2021-01-25 06:19

I have two fxml files. I connect them with an include statement:

The \"main\" fxmlfile looks like that:



        
相关标签:
1条回答
  • 2021-01-25 07:15

    You need to have a different controller for each FXML file, and the fx:id-annotated elements of each file will be injected into the corresponding controller instance.

    When you have included FXML files, you can inject the controller for the included file into the controller for the including file, by setting an fx:id attribute on the fx:include element:

    "main" fxml file:

    <?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>
    

    and in the "main controller":

    public class MyMainController {
    
        @FXML
        private AnotherController anotherController ;
    
        // ...
    }
    

    (the rule being that the field name is the value of the fx:id attribute with "Controller" appended). Here AnotherController is the controller class for AnotherFile.fxml.

    Now you can, for example, expose the data you need to access in the "included controller":

    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);
        }
    
        // ...
    }
    

    and then your main controller can do things like

    anotherController.setText(...);
    

    which will of course update the label. This preserves encapsulation, so that if you choose to use another control instead of a label, those changes do not have to propagate outside of the immediate controller.

    0 讨论(0)
提交回复
热议问题