设置root的JavaFx FXML加载文件问题

时间:2014-05-19 03:25:44

标签: java netbeans javafx scenebuilder

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异常:

  

应用程序启动方法中的异常...   引发者:javafx.fxml.LoadException:尚未设置Root。在加载之前使用方法setRoot()。

但是当我使用

scene.setRoot(root); 

经历了同样的例外

我已经将问题缩小到这样一个事实,即我的FXML文件无法在Parent对象中设置为root,但却无法解决这个问题。任何建议都会非常感谢。

4 个答案:

答案 0 :(得分:5)

<fx:root>指定&#34;动态root&#34;为您的FXML文件;这意味着FXML文件的根是在加载文件之前在加载器上设置的对象。这通常用于自定义控件,您希望控件是Node的子类,可以使用常规Java代码进行实例化,但希望使用FXML定义其布局。 <fx:root>中显示了<fx:root>的正确使用(或至少是如何使用它的示例)。特别是,如果您使用FXMLLoader,则必须:

  1. 创建FXMLLoader.load(URL)实例,而不是使用静态便捷VBox方法
  2. 在该实例上调用setRoot(...),并传入将成为FXML根目录的对象。
  3. 对于标准FXML使用,您只需使用常规实例声明作为根。几乎所有可用的示例都是这样的:可能最好的起点是standard documentation。在您的情况下,因为您需要<VBox xmlns="javafx.com/javafx/8"; xmlns:fx="javafx.com/fxml/1"; fx:controller="divergex.DivergexGUIController"> <!-- ... --> </VBox> ,您可能只需要

    {{1}}

    编辑如果Netbeans给您带来问题,我建议您使用带有official tutorial的Eclipse。这是一个非常准确的,但几乎所有你需要的,e(fx)clipse plugin

答案 1 :(得分:2)

在场景构建器中取消选中id :: root 或将id :: root更改为vbox

答案 2 :(得分:0)

借助Scene Builder创建FXML文件时。它使用fx:root作为窗格。将其替换为锚定窗格

   AnchorPane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.Controller

对我有用。任何人都可以尝试,可能对您有帮助

答案 3 :(得分:-1)

您不应该在场景构建器中使用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">