设置root的JavaFx FXML加载文件问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置root的JavaFx FXML加载文件问题相关的知识,希望对你有一定的参考价值。
作为javaFx的新手,并且想要使用场景构建器进行GUI开发,我遇到了一个问题,没有运气搜索网站或一般网络我的问题,虽然已经提出了类似的问题,认为可能需要不同的视角。我试图在快速构建之后通过Netbeans加载FXML文件以测试功能,因此代码很简单,但我无法在控制器中设置根文件。我的代码是以下公共类Divergex扩展Application {
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("DivergexGUI.fxml"));
Scene scene = new Scene(root);
scene.setRoot(root);
stage.setScene(scene);
stage.show();
}
我已经尝试过将fxroot更改为Vbox而没有运气的建议,我继续在编译时获得Load异常:
Application start方法中的异常...引起:javafx.fxml.LoadException:尚未设置Root。在加载之前使用方法setRoot()。
但是当我使用的时候
scene.setRoot(root);
经历了同样的例外
我已经将问题缩小到这样一个事实,即我的FXML文件无法在Parent对象中设置为root,但却无法解决这个问题。任何建议都会非常感谢。
<fx:root>
为您的FXML文件指定“动态根”;这意味着FXML文件的根是在加载文件之前在加载器上设置的对象。这通常用于自定义控件,您希望控件是Node
的子类,可以使用常规Java代码进行实例化,但希望使用FXML定义其布局。在<fx:root>
中显示了正确使用standard documentation(或至少是如何使用它的一个例子)。特别是,如果你使用<fx:root>
,你必须:
- 创建一个
FXMLLoader
实例,而不是使用静态方便FXMLLoader.load(URL)
方法 - 在该实例上调用setRoot(...),并传入将成为FXML根的对象。
对于标准FXML使用,您只需使用常规实例声明作为根。几乎每个可用的例子都是这样的:可能最好的起点是official tutorial。在你的情况下,因为你想要一个VBox
,你可能只需要
<VBox xmlns="javafx.com/javafx/8"; xmlns:fx="javafx.com/fxml/1"; fx:controller="divergex.DivergexGUIController">
<!-- ... -->
</VBox>
编辑如果Netbeans给你带来问题,我推荐使用Eclipse和e(fx)clipse plugin。有一个非常准确的,但几乎所有你需要的,tutorial。
在场景构建器中取消选中id :: root或将id :: root更改为vbox
只是你不应该在场景构建器中使用fx:root构造。所以从fxml文件中删除这行代码。
例如:<fx:root prefHeight="246.0" prefWidth="479.0" type="AnchorPane" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.mycontroller">
以上是关于设置root的JavaFx FXML加载文件问题的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX borderpane.setCenter 替换了整个场景
如何确定我的 JavaFX 应用程序所需的 FXML 文件、CSS 文件、图像和其他资源的正确路径?