簡體   English   中英

JavaFx在FXML中包含自定義組件

[英]JavaFx Include custom components in FXML

我嘗試找到有關如何將自定義javafx對象包含到fxml文件中的解決方案。

例如

package myExtendedObjects;

import javafx.scene.control.Label;

public class MyLabel extends Label interface connected{

    MyLabel(){
        super();
    }
  //Custom Code ...
}

到fxml

<?import myExtendedObjects.myLabel?>
<myLabel text="Name" />

我總是從類型javafx.fxml.LoadException中獲取錯誤代碼:也許有一個更好的解決方案,然后創建自定義類。 但是我需要一個帶有自定義接口的標簽(已連接)。 也許另一種解決方案是創建僅包含標簽的fxml文件,並使用接口為此設置控制器類。

編輯:

try {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Viewer.fxml"));
        Parent root = fxmlLoader.load();
        Scene scene = new Scene(root);
        controller = fxmlLoader.getController();
        primaryStage.setScene(scene);
        primaryStage.show();
    } catch(Exception e) {
        e.printStackTrace();
    }

編輯2:更改名稱后,我能夠導入自定義對象而不會出現錯誤,但是當我嘗試插入時

<MyLabel fx:id="myLabel"/>

在我的XML日期我得到這個錯誤

javafx.fxml.LoadException: 
/C:/Users/TheOLGPC/Desktop/java/SolarimpactTelemety2/bin/fxml/Viewer.fxml:48

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1013)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at application.Main.start(Main.java:24)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil can not access a member of class myExtendedObjects.MyLabel with modifiers ""
at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.reflect.misc.ReflectUtil.newInstance(Unknown Source)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1009)
... 15 more

應用程序啟動方法異常

Java有多種命名約定 ,包括類名應大寫,包名稱應全部小寫,而字段和方法名應以小寫開頭。

雖然Java編譯器和運行時僅將它們視為約定,並且將從上下文中確定任何實體是類還是屬性(實質上與名稱無關),但對於FXML和FXMLLoader ,情況並非如此。

FXML文檔指出:

如果元素的標簽以大寫字母開頭,則該標簽被視為實例聲明

后來

標簽名稱以小寫字母開頭的元素表示對象屬性。

因此,如果您的類未能遵循通常的命名約定,則它們可能無法在FXML中正常工作。 確保類和接口名稱使用大寫字母,屬性名稱不使用大寫字母,並且程序包名稱全部使用小寫字母,並確保在Java代碼和FXML中一致使用它們。

另外, FXMLLoader將通過調用(通常是)無參數構造函數來創建類的實例。 為了使它起作用,構造函數必須是公共的:

package myExtendedObjects;

import javafx.scene.control.Label;

public class MyLabel extends Label interface connected{

    public MyLabel(){
        super();
    }
  //Custom Code ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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