设置根目录时出现JavaFx FXML加载文件问题

设置根目录时出现JavaFx FXML加载文件问题,java,netbeans,javafx,scenebuilder,Java,Netbeans,Javafx,Scenebuilder,刚接触javaFx并希望使用scenebuilder进行GUI开发,我遇到了一个问题,在搜索网站或整个web时都没有找到我的问题,尽管有人问过类似的问题,但我认为可能需要不同的视角。在快速构建测试功能之后,我试图通过Netbeans加载一个FXML文件,因此代码很简单,但我无法在控制器中设置根文件。我的代码如下 公共类Divergex扩展了应用程序{ @Override public void start(Stage stage) throws Exception { Parent ro

刚接触javaFx并希望使用scenebuilder进行GUI开发,我遇到了一个问题,在搜索网站或整个web时都没有找到我的问题,尽管有人问过类似的问题,但我认为可能需要不同的视角。在快速构建测试功能之后,我试图通过Netbeans加载一个FXML文件,因此代码很简单,但我无法在控制器中设置根文件。我的代码如下 公共类Divergex扩展了应用程序{

@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的建议,但没有成功,我继续在编译时遇到加载异常:

应用程序启动方法中出现异常。。。 原因:javafx.fxml.LoadException:尚未设置根。请在加载前使用方法setRoot()

然而当我使用

scene.setRoot(root); 
同样的例外情况也会发生

我已将问题缩小到无法将FXML文件设置为父对象中的根,但没有解决此问题的运气。任何建议都将非常感谢。

指定“动态根”对于您的FXML文件,这意味着FXML文件的根是在加载文件之前在加载程序上设置的对象。这通常用于自定义控件,其中您希望控件是可以使用常规Java代码实例化的
节点
的子类,但希望使用FXML定义其布局。正确使用
(或至少是如何使用de>的示例)显示在中。特别是,如果使用
,则必须:

  • 创建一个
    fxmloader
    实例,而不是使用静态便利
    fxmloader.load(URL)
    方法
  • 在该实例上调用setRoot(…),并传入要作为FXML根的对象
  • 对于标准的FXML使用,您只需使用常规的实例声明作为根。几乎所有可用的示例都是这样工作的:最好的开始位置可能是。在您的情况下,由于您需要
    VBox
    ,您可能只需要

    <VBox xmlns="javafx.com/javafx/8"; xmlns:fx="javafx.com/fxml/1"; fx:controller="divergex.DivergexGUIController">
    <!-- ... -->
    </VBox>
    
    
    

    编辑如果Netbeans给您带来了问题,我建议使用Eclipse和。有一个非常简单的,但几乎是您所需要的一切,。

    取消选中id::root in Science builder
    或者将id::root更改为vbox

    ,只是不应在场景生成器中使用fx:root构造。 因此,请从fxml文件中删除这行代码


    例如:

    在场景生成器的帮助下创建FXML文件时。它使用fx:root作为窗格。将其替换为锚窗格

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

    它对我很有用。任何人都可以尝试,它可能会对你有所帮助

    你能显示fxml文件,或者至少显示它的根元素吗?是的,这是完整的文件,同样简单,只需获得一个工作表单为什么你要使用
    ?它是Scenebuilder的默认构建,并设置了一个控制器,我对JavaFx不熟悉,所以教程我ent让我用它来写我的FXML,如果有更好的选择,我很乐意使用它,我只是还没有找到一个明确的解决方案。我不是一个(经常使用的)SceneBuilder用户。我认为,
    Ancorpane
    是SceneBuilder的默认根元素。这已经够糟糕了-
    Ancorpane
    对于大多数应用程序来说都是毫无用处的。
    实际上是一个更糟糕的默认选择;它实际上只适用于非常特殊的用例。我尝试使用Ancorpane作为我的根元素,但没有成功支持控制器,VBox也不支持控制器,但在使用VBox声明编译后,我成功构建了带有按钮功能的GUI,谢谢。只是不确定这是否正常,因为我的IDE声称VBox不支持控制器属性。请解释“不支持控制器”…您只需向FXML.correct的根元素添加一个
    fx:controller
    属性,但在添加该属性时,Netbeans会显示一条警告“…Class'javafx.scene.layout.VBox'不支持属性'controller'…”听起来你可能把
    controller='…'
    而不是
    fx:controller='…'
    ?没有使用
    fx:controller
    有趣的是,它工作正常,只显示警告。例如,你让答案未完成。