2015-12-08 62 views
0

如果我爲我的javafx項目編譯我的控制器和主類,它們都編譯時沒有任何錯誤,並且如果我運行主類Javafx(我在scene-如果控制器沒有連接到javafx,它將彈出它應有的樣子。當我試圖通過場景生成器來控制Java文件連接到JavaFX的,然後嘗試運行該項目,該GUI不會彈出,它會給我的錯誤此列表:嘗試將控制器類連接到javafx時出錯

C:\Users\Kenny's\Desktop\Project3>java Project3 
    Exception in Application start method 
    java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
    Caused by: java.lang.RuntimeException: Exception in Application start method 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) 
    at java.lang.Thread.run(Thread.java:745) 
    Caused by: javafx.fxml.LoadException: 
    /C:/Users/Kenny's/Desktop/Project3/Project3.fxml 

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104) 
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097) 
    at Project3.start(Project3.java:12) 
    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) 
    ... 1 more 
    Caused by: java.lang.IllegalArgumentException: Can not set javafx.scene.control.ComboBox field Project3Controller.location to java.net.URL 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) 
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) 
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) 
    at java.lang.reflect.Field.set(Field.java:764) 
    at javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1163) 
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2554) 
    ... 17 more 
    Exception running application Project3 

    C:\Users\Kenny's\Desktop\Project3> 

我曾嘗試找到一個解決方案,我已經嘗試了一個完全空白的控制器類和一切,它仍然無法正常工作。 任何人都知道任何解決方案?

回答

2

哦,這有點邪惡。如你所知,當加載FXML文件時,它在控制器中注入具有相應fx:id屬性(FXML文件中與控制器中的字段名稱匹配的屬性值)的元素的註釋爲@FXML的字段。

什麼是已知的(和沒有記錄的)是有少量(好,兩個)額外的值可以注入。例如,你可以做

@FXML 
private ResourceBundle resources ; 

去提供給FXMLLoader資源包的參考。同樣的,你可以去提供給FXMLLoader與(你猜對了)的URL的引用:

@FXML 
private URL location ; 

這些自動發生。

所以,從堆棧跟蹤看起來你已經在你的FXML文件和控制器,你叫location定義的ComboBox

@FXML 
private ComboBox<String> location ; 

當FXML裝載機看到這一點,可能之前就試圖解析FXML文件,它嘗試將提供給加載器的URL注入字段,當然因爲它試圖將URL分配給ComboBox而失敗。

要解決,只是改變了組合框的名稱:

@FXML 
private ComboBox<String> locationCombo ; 

,同樣在您FXML文件fx:id屬性。

+0

非常感謝你!我剛剛進入並更改了組合框的所有fx:id,並更新了控制器,現在它可以工作! – Ksmart

+0

請注意這個問題是正確的:如果他們遇到同樣的事情,它會幫助其他人發現它(並且,正如我所指出的那樣,除非您有相當多的JavaFX經驗,否則很難弄清楚)。 –

相關問題