为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕丝7291255 2022-06-23 10:25:02
我有一个带有 main.fxml 的 FXML 应用程序,其中包括另外两个 fxml 文件。这些 fxml 文件中的每一个都有自己的控制器类。我的问题是,如何从特定控制器访问对象,尽管这些对象是在另一个 fxml 文件中定义的。以下代码只是一个最小的示例。我认为将 ui 元素拆分为不同的 fxml 文件是个好主意,因为它们越来越大。我的主要 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>顶部.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>底部.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>对于 top.fxml,我创建了这个控制器类:public class ControllerTop {    @FXML public Button topbtn;    @FXML public Button bottombtn;    @FXML    public void printOutput() {        System.out.println("Hello from top button");        topbtn.setDisable(true); //OK!        bottombtn.setDisable(false); //Failed    }}当然bottombtn是在bottom.fxml中定义的,并且有自己的控制器。问题是,这个ControllerTop 的printOut() 的bottombtn 会导致NullPointerException。所以我需要帮助,以一种漂亮而聪明的方式访问对象。
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

在主控制器中:


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

        }

    });


}

}

底部.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>

顶部.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**;


底部控制器:


public class BottomController {    

    public Button bottombtn;

}

顶级控制器:


public class TopController {

    public Button topbtn;

}

另一个 用于设置topController值initialize的选项MainControllerbottombtn


查看完整回答
反对 回复 2022-06-23
  • 1 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信