获取对不同fxml文件中的ui元素的访问

时间:2019-02-17 13:11:23

标签: java javafx fxml

我有一个带有main.fxml的FXML应用程序,其中包括另外两个fxml文件。每个fxml文件都有其自己的控制器类。

我的问题是,如何从特定控制器访问对象,尽管这些对象是在另一个fxml文件中定义的。

以下代码只是一个最小的示例。我认为将ui元素拆分为不同的fxml文件是一个好主意,因为它们越来越大。

我的主要fxml:

var sr = this.saveResult;
sr.call(this, "abc");

top.fxml:

<VBox xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
   <fx:include fx:id="top" source="top.fxml"/>
   <fx:include fx:id="bottom" source="bottom.fxml"/>
</VBox>

bottom.fxml

<VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="ControllerTop">
  <children>
    <Button fx:id="topbtn" onAction="#printOutput" text="OK" />
  </children>
</VBox>

对于top.fxml,我已经创建了该控制器类:

<VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="ControllerBottom">
  <children>
    <Button fx:id="bottombtn" onAction="#printOutput" text="OK" />
  </children>
</VBox>

当然,bottombtn是在bottom.fxml中定义的,并且具有自己的控制器。问题是,此ControllerTop的printOut()的bottombtn导致NullPointerException。因此,我需要以一种很好的方式来访问对象。

谢谢

1 个答案:

答案 0 :(得分:1)

在主控制器中:

public class MainController {
/**
 * var name has to be topController
 */
public TopController topController;
/**
 * var name has to be bottomController
 */
public BottomController bottomController;

public void initialize(){
    Button topbtn=topController.topbtn;
    Button bottombtn=bottomController.bottombtn;
    topbtn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello from top button");
            topbtn.setDisable(true); //OK!
            bottombtn.setDisable(false); //Failed
        }
    });

}
}

bottom.fxml:

    <VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="BottomController">
  <children>
    <Button fx:id="bottombtn" text="OK" />
  </children>
</VBox>

top.fxml:

 <VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="TopController">
  <children>
    <Button fx:id="topbtn" text="OK" />
  </children>
</VBox>

并在类TopController和BottomController中设置@FXML public Button **btnName**;

BottomController:

public class BottomController {    
    public Button bottombtn;
}

TopController:

public class TopController {
    public Button topbtn;
}

另一种选择是使用initialize上的MainController在topController中设置bottombtn的值