猿问

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

我有一个带有 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。所以我需要帮助,以一种漂亮而聪明的方式访问对象。


慕丝7291255
浏览 71回答 1
1回答

开满天机

在主控制器中:public class MainController {/**&nbsp;* var name has to be topController&nbsp;*/public TopController topController;/**&nbsp;* var name has to be bottomController&nbsp;*/public BottomController bottomController;public void initialize(){&nbsp; &nbsp; Button topbtn=topController.topbtn;&nbsp; &nbsp; Button bottombtn=bottomController.bottombtn;&nbsp; &nbsp; topbtn.setOnAction(new EventHandler<ActionEvent>() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void handle(ActionEvent event) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Hello from top button");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; topbtn.setDisable(true); //OK!&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bottombtn.setDisable(false); //Failed&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });}}底部.fxml:&nbsp; &nbsp; <VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="BottomController">&nbsp; <children>&nbsp; &nbsp; <Button fx:id="bottombtn" text="OK" />&nbsp; </children></VBox>顶部.fxml:&nbsp;<VBox fx:id="vbox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="TopController">&nbsp; <children>&nbsp; &nbsp; <Button fx:id="topbtn" text="OK" />&nbsp; </children></VBox>并在 TopController 和 BottomController 类中设置 @FXML public Button **btnName**;底部控制器:public class BottomController {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public Button bottombtn;}顶级控制器:public class TopController {&nbsp; &nbsp; public Button topbtn;}另一个 用于设置topController值initialize的选项MainControllerbottombtn
随时随地看视频慕课网APP

相关分类

Java
我要回答