2015-12-08 79 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经验,否则很难弄清楚)。 –

相关问题