JavaFX8,控制器继承
在从JavaFX2.2迁移到JavaFX8的过程中,我遇到了一些问题; JavaFX8不支持静态@FXML元素 我有以下情况(代码简化): 父控制器:JavaFX8,控制器继承,java,nullpointerexception,javafx-8,fxml,Java,Nullpointerexception,Javafx 8,Fxml,在从JavaFX2.2迁移到JavaFX8的过程中,我遇到了一些问题; JavaFX8不支持静态@FXML元素 我有以下情况(代码简化): 父控制器: public abstract class ParentController implements Initializable { @FXML protected Label parentLabel; @Override public void initialize(URL location, ResourceBundle resources
public abstract class ParentController implements Initializable {
@FXML
protected Label parentLabel;
@Override
public void initialize(URL location, ResourceBundle resources) {
// do smth
}
}
子控制器(不止一个子控制器):
在这段代码的前一个版本中,parentLabel是静态的,工作正常。
但现在我在尝试在标签上设置文本时出现了NullPointerException
我正在寻找这种情况下最简单的解决方案
UPD 1.
子fxml:
<AnchorPane id="" fx:id="apDentalClinics" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="590.0" prefWidth="1200.0" style="" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="com.package.ChildController">
<children>
//Something here, except our lable
</children>
</AnchorPane>
//这里有些东西,除了我们的标签
我刚刚一字不差地粘贴了您的代码,效果很好。你能举一个FXML文件和应用程序
子类失败的例子吗?我不理解你发布的FXML。如果您没有
,那么父标签必然是null
,您会得到null点异常。这与继承的控制器无关,只是因为您没有具有匹配的fx:id
的节点。如果您有
,则它会按预期工作。你能更全面地解释一下你到底想做什么吗?是的。。。将调用父控制器的initialize()方法,因为您显式地这样做。但无论你想做什么,这都是错误的方法parentLabel
是一个实例变量,因此第一个子控制器将初始化属于该控制器实例的parentLabel
字段。它显然不会初始化属于其他控制器实例的parentLabel
。另一方面,您当然不希望parentLabel
成为static
,因为所有控制器实例都将共享同一个标签,并且您不能在场景中添加两次相同的节点。因此,看起来您基本上是在尝试将其用作在两个不同控制器之间共享某些数据(标签文本)的黑客?是这样吗?如果是这样,您的问题实际上是“如何在控制器之间共享数据?”(这是完全错误的方法)。所以你可能应该试着从这个角度来思考这个问题,然后根据需要发布一个新的问题。看看它是否能让你开始。坦率地说,静态@FXML
-注入的字段是无意义的,因此您可能需要进行一些重写。从共享数据的角度考虑:因此您可以考虑将StringProperty
提供给不同的控制器。我只是逐字粘贴了您的代码,效果很好。你能举一个FXML文件和应用程序
子类失败的例子吗?我不理解你发布的FXML。如果您没有
,那么父标签必然是null
,您会得到null点异常。这与继承的控制器无关,只是因为您没有具有匹配的fx:id
的节点。如果您有
,则它会按预期工作。你能更全面地解释一下你到底想做什么吗?是的。。。将调用父控制器的initialize()方法,因为您显式地这样做。但无论你想做什么,这都是错误的方法parentLabel
是一个实例变量,因此第一个子控制器将初始化属于该控制器实例的parentLabel
字段。它显然不会初始化属于其他控制器实例的parentLabel
。另一方面,您当然不希望parentLabel
成为static
,因为所有控制器实例都将共享同一个标签,并且您不能在场景中添加两次相同的节点。因此,看起来您基本上是在尝试将其用作在两个不同控制器之间共享某些数据(标签文本)的黑客?是这样吗?如果是这样,您的问题实际上是“如何在控制器之间共享数据?”(这是完全错误的方法)。所以你可能应该试着从这个角度来思考这个问题,然后根据需要发布一个新的问题。看看它是否能让你开始。坦率地说,静态@FXML
-注入的字段是无意义的,因此您可能需要进行一些重写。从共享数据的角度考虑:因此您可以从使StringProperty
可用于不同控制器的角度考虑。
<AnchorPane id="" fx:id="apDentalClinics" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="590.0" prefWidth="1200.0" style="" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="com.package.ChildController">
<children>
//Something here, except our lable
</children>
</AnchorPane>