[英]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.