Java FX嵌套控制器问题,MainController没有InnerController

时间:2018-02-09 15:47:55

标签: java javafx controller nested

我正在努力学习Java FX中的嵌套控制器。我已经阅读了一些教程(最值得注意的是这个:https://www.youtube.com/watch?v=osIRfgHTfyg),我的代码中的所有东西看起来都没问题...除了我的OuterController似乎没有对InnerController的引用。

解释:我有一个OuterController.java控制我的应用程序的外部骨架。为了简短起见,OuterController有一个TabPane; InnerController的代码是Tab1的内容。 (为简洁起见,我省略了TabPane控制器代码。)“Tab1”有一个名为“testMe”的按钮。

这是外部控制器。我确定问题出在“private @FXML InnerController myInnerController”行。代码运行时,“myInnerController”变量为null:

// OuterController.java

package controllers;

import javafx.fxml.FXML;

public class OuterController{

    private  @FXML  InnerController  myInnerController;    // << doesn't pick up the InnerController
    Stage stage;

    public void start(Stage stage) throws Exception{
        this.stage = stage;
        if(myInnerController == null){
            System.out.println("Gack!  InnerController is null!");
        }
    }
}

这是外部控制器的FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control....lots of import statements here....?>

<AnchorPane fx:id="AnchorPaneRoot" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="781.0" prefWidth="1356.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.OuterController">
   <children>
      <TabPane fx:id="myTabPane" layoutX="14.0" layoutY="457.0" prefHeight="314.0" prefWidth="739.0" tabClosingPolicy="UNAVAILABLE">
        <tabs>
            <Tab text="Tab1">
               <content>
                  <!--  include statement ties me to the InnerController  -->
                  <fx:include fx:id="AnchorPaneInnerController" source="InnerController.fxml" />
               </content></Tab>
        </tabs>
      </TabPane>
   </children>
</AnchorPane>

这是内部控制器:

// InnerController.java

package controllers;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;

public class InnerController {

    @FXML  AnchorPane  AnchorPaneInnerController;   // not sure I need this
    @FXML  Button      testMe;

    private @FXML   void initialize(){
        System.out.println("Inner Controller started...!");

        testMe.setOnAction(event -> {
            System.out.println("testMe pressed!!!");
        });
    }
}

为了完成,这里是内部控制器的FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane fx:id="AnchorPaneInnerController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="246.0" prefWidth="740.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.InnerController.java">
   <children>
      <Button fx:id="testMe" layoutX="211.0" layoutY="108.0" mnemonicParsing="false" text="Test Me" />
   </children>
</AnchorPane>

代码编译并运行;没有错误代码或警告。这是输出,假设您单击“testMe”三次:

Inner Controller started...!
Gack!  InnerController is null!
testMe pressed!!!
testMe pressed!!!
testMe pressed!!!

你看到了问题。 InnerController运行得很好,作为用户,我可以点击“testMe”到我心中的内容。但是为什么OuterController的“myInnerController”变量“指向”InnerController的实例化呢?这是一个严格的命名约定吗?

另一个问题......我倾向于将“@FXML thingee variableName”语句视为对Java控制器文件的指令,意思是“查看你的FXML文件,你会看到一个类型的对象'thingee',名称为'variableName';只是将其作为实例化对象加载。“如果是这种情况,那么我的”private @FXML InnerController myInnerController;“可能会跳闸,因为变量名称为”myInnerController来自InnerController FXML的“和”AnchorPaneInnerController“不匹配......?不知道这里还有什么问题。

非常感谢任何建议和/或批评,谢谢。

0 个答案:

没有答案