[英]JavaFx FXML load file issues with setting root
我是 javaFx 的新手並希望使用 Scenebuilder 進行 GUI 開發,但我遇到了一個問題,在網站或網絡上搜索我的問題時沒有運氣,盡管已經提出了類似的問題,但我認為可能需要不同的視角。 我試圖在快速構建后通過 Netbeans 加載 FXML 文件以測試功能,因此代碼很簡單,但我無法在控制器中設置根文件。 我的代碼是以下公共類 Divergex extends 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:尚未設置根。 在加載之前使用方法 setRoot()。
然而當我使用
scene.setRoot(root);
遇到同樣的異常
我已將問題縮小到我的 FXML 文件無法在 Parent 對象中設置為根的事實,但沒有解決這個問題。 任何建議都會非常感謝。
<fx:root>
為您的 FXML 文件指定一個“動態根”; 這意味着 FXML 文件的根是一個在加載文件之前在加載器上設置的對象。 這通常用於自定義控件,您希望控件是Node
的子類,可以使用常規 Java 代碼實例化,但希望使用 FXML 定義其布局。 標准文檔中顯示了<fx:root>
正確使用(或至少是如何使用它的示例)。 特別是,如果您使用<fx:root>
您必須:
FXMLLoader
實例,而不是使用靜態方便的FXMLLoader.load(URL)
方法 對於標准 FXML 使用,您只需使用常規實例聲明作為根。 幾乎所有可用的示例都是這樣工作的:可能最好的起點是官方教程。 在你的情況下,因為你想要一個VBox
,你可能只需要
<VBox xmlns="javafx.com/javafx/8"; xmlns:fx="javafx.com/fxml/1"; fx:controller="divergex.DivergexGUIController">
<!-- ... -->
</VBox>
編輯如果 Netbeans 給您帶來問題,我建議將 Eclipse 與e(fx)clipse 插件一起使用。 有一個非常准系統,但幾乎所有你需要的,教程。
在場景生成器中取消選中 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">
當您在 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
這個對我有用。 任何人都可以嘗試,它可能對你有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.