新的javaFx和想要使用场景生成器的GUI开发,我遇到了一个问题,没有运气搜索网站,也没有一般的网络为我的问题,虽然类似的问题已经被问到,认为一个不同的角度可能需要。我试图通过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的建议,但没有运气,我继续在编译时获得Load异常:
应用程序启动方法异常…原因:javafx. xml. loadexception: Root未设置。加载前使用setRoot()方法
然而当我使用
时scene.setRoot(root);
遇到相同的异常
我已经把问题缩小到这样一个事实,即我的FXML文件无法被设置为父对象中的根,但在解决这个问题时没有运气。如有任何建议,非常感谢。
<fx:root>
指定FXML文件的"动态根";这意味着FXML文件的根是在加载文件之前在加载器上设置的对象。这通常用于自定义控件,其中您希望控件是Node
的子类,可以使用常规Java代码实例化,但希望使用FXML定义其布局。正确使用<fx:root>
(或至少一个如何使用它的例子)显示在标准文档中。特别是,如果您使用<fx:root>
,您必须:
- 创建
FXMLLoader
实例,而不是使用静态方便的FXMLLoader.load(URL)
方法 - 在该实例上调用seroot(…),并传入要成为FXML根的对象。
对于标准的FXML使用,您只需使用常规的实例声明作为根。几乎所有可用的示例都是这样工作的:可能最好的起点是官方教程。在您的例子中,因为您想要一个VBox
,您可能只需要
<VBox xmlns="javafx.com/javafx/8"; xmlns:fx="javafx.com/fxml/1"; fx:controller="divergex.DivergexGUIController">
<!-- ... -->
</VBox>
编辑如果Netbeans给你的问题,我建议使用Eclipse与e(fx)clipse插件。这是一个非常简单的,但几乎所有你需要的教程。
uncheck id::root或者将id::root改为vbox
只是你不应该在场景生成器中使用fx:root construct。因此,从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">
当您使用场景生成器创建FXML文件时。它使用fx: root作为窗格。将其替换为锚窗格
AnchorPane xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.Controller
这对我有用。任何人都可以尝试,它可能对你有帮助