JavaFXML Spring控制器工厂

时间:2019-02-25 14:24:58

标签: java spring javafx

我有一个正在处理的JavaFX项目,似乎在Java更新中遇到了问题。该项目中的gui是使用场景构建器构建的,并且spring用于依赖项注入。我目前正在使用Java 11 jre运行JavaFX 11。该项目最初是使用Java 8和JavaFX 2构建的。下面显示的loadScreens方法在我的主控制器类中,该类负责将所有屏幕加载到哈希图中。然后,所有其他控制器类共享该主控制器类的一个实例,并可以在哈希图中的任何屏幕上调用setScreen方法,并且主控制器将在单个阶段上对其进行设置,该阶段也由所有控制器共享。

public void loadScreens() {

    for(String screen: screens) {
    try {
        InputStream fxmlStream = getClass().getResourceAsStream(screen);
        FXMLLoader loader = new FXMLLoader();
        URL location = getClass().getResource(screen);
        loader.setLocation(location);
        loader.setControllerFactory(context::getBean);
        Object x = loader.load(fxmlStream);  // Problem Line
        //FXMLLoader loader = new FXMLLoader(getClass().getResource(screen));
        //loader.setControllerFactory(context::getBean);
        //Scene scene = new Scene(loader.load()); //Problem Line
        //scene.setFill(Color.TRANSPARENT);
        //addScreen(screen, scene);
    }catch(Exception e) {
        e.printStackTrace();
    }

}

我发现目前网上尚无评论,但似乎无法解决问题。评论出来的是曾经有用的东西,但是尽管我几个月来都没碰过这个课,但现在不再有用了。 Java更新后,它坏了。这是堆栈跟踪

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.NoSuchMethodError: sun.reflect.misc.ReflectUtil.newInstance(Ljava/lang/Class;)Ljava/lang/Object;
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.constructValue(FXMLLoader.java:1009)
    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.load(FXMLLoader.java:2425)
    at studentApp.view.ScreenController.loadScreens(ScreenController.java:136)
    at studentApp.view.GuiControllerFramework.start(GuiControllerFramework.java:35)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more
Exception running application studentApp.view.GuiControllerFramework

我认为这可能是因为FXMLLoader类为no arg .load()方法返回了一个Object,因为它说没有这样的方法,因为它是一个Object。因此,我第二次添加了“ Object x”行,但首先尝试将对象强制转换为Scene,这是不起作用的,因为场景类中没有匹配的构造函数,因此我尝试将其强制转换为类型Parent并没有停止错误从发生。最初,从注释的代码中可以看出,我只是将no arg load方法传递给了场景构造函数,并且一切正常。现在,由于添加了这个独立的javaFX 11,我的代码不再起作用。我并不是很想回到javaFX 2,但是已经坚持了好几天。如果我使用原来的代码(现在注释掉了),并注释掉加载线及其下面的两个代码,则尽管出现空白,它仍可以正常编译。可以看出,我将springs应用程序上下文用于bean定义。如果有人有任何想法,我将不胜感激。谢谢大家。

1 个答案:

答案 0 :(得分:0)

您实际上是继续使用Java 11 jdk重建所有代码吗?

如果没有,那是我要尝试的第一件事。做一个与您正在使用的构建工具等效的Maven全新安装。

How do I fix a NoSuchMethodError?也值得一查,尤其要注意克里斯·杜特罗和马特b的回答。