0

I have a JavaFX project that I'm working on and seem to have encountered an issue from a Java update. The gui's in the project were built using scene builder and spring is used for dependency injection. I am currently running JavaFX 11 with a Java 11 jre. The project was originally built using Java 8 and JavaFX 2. The loadScreens method shown below is in my main controller class that is responsible for loading all the screens into a hashmap. All the other controller classes then share an instance of this main controller class and can call a setScreen method on any screen in the hashmap and the main controller will set it on the single stage which is also shared by all the controllers.

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();
    }

}

I found what is currently not commented out on the net but it didn't seem to fix the issue. What is commented out is what used to work but now no longer does despite the fact that I havnt touched this class in months. After the java update, it broke. Heres the stack trace

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

I thought that maybe because the FXMLLoader class returns an Object for the no arg .load() method that it was saying that there was no such method because it was an Object. So I added the "Object x" line second, but first tried casting the object to Scene, which doesn't work because there is no matching constructor in the scene class and I tried casting it to type Parent which didn't stop the error from occuring. Originally, as can be seen in the commented out code, I just passed the no arg load method into the scene constructor and everything worked fine. Now since adding this standalone javaFX 11 my code doesn't work anymore. I don't exactly want to go back to javaFX 2 but have been stuck on this for days. If I use my original, now commented out code, and comment out the load line and the two below it, it compiles fine though I get a blank scene. As can be seen I am using springs application context for the bean definitions. If anyone has any ideas I'd greatly appreciate it. Thanks guys.

Mustahsan
  • 3,852
  • 1
  • 18
  • 34
Ct_Laake
  • 1
  • 2

1 Answers1

0

Did you actually go ahead and rebuild all of the code with java 11 jdk?

If not, that's the first thing I'd attempt. Do a maven clean install equivalent of whatever build tool you are using.

Also How do I fix a NoSuchMethodError? is worth a check, in particular take note of the answers from Chris Dutrow and matt b.

Ivan Furdek
  • 711
  • 6
  • 6
  • Ivan, thanks for the reply. I've been looking into what you said and will take a few days to completely rebuild the project and ensure its getting compiled and run with the same versions of Java and JavaFX as stated in the link you posted. Thanks again and I'll let you know how it goes. – Ct_Laake Feb 26 '19 at 23:58
  • @Ct_Laake no problems, hope you get to the bottom of it :) – Ivan Furdek Feb 27 '19 at 07:42
  • 1
    I built an entirely new project with new jars and am in the process of copy pasting the code, lol, into the new project. I got springs application context, the basic screen controller class and one of the gui's along with its corresponding controller all set up and tested it. Success! I unfortunately can't give everyone a reason for the application failure. Id guess one of the jars that was in the class path was not up to date but I cant say for sure. I will say that though it may be a few day pain, rebuilding the project with fresh jars seems to have fixed it. Thanks again to Ivan Furdek! – Ct_Laake Mar 02 '19 at 04:17