我正在努力学习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
“不匹配......?不知道这里还有什么问题。
非常感谢任何建议和/或批评,谢谢。