簡體   English   中英

設置 root 的 JavaFx FXML 加載文件問題

[英]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>您必須:

  1. 創建一個FXMLLoader實例,而不是使用靜態方便的FXMLLoader.load(URL)方法
  2. 在該實例上調用 setRoot(...),並傳入將成為 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 插件一起使用 有一個非常准系統,但幾乎所有你需要的,教程

在場景生成器中取消選中 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM