У меня есть проект JavaFX, над которым я работаю, и, похоже, возникла проблема с обновлением Java.Интерфейсы в проекте были построены с использованием конструктора сцен, а пружина используется для внедрения зависимостей.В настоящее время я использую JavaFX 11 с Java 11 JRE.Первоначально проект был построен с использованием 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 x» во вторую очередь, но сначала попытался привести объект к Scene, что не работает, потому что в классе сцены нет соответствующего конструктора, и я попытался привести его к типу Parent, который не остановил ошибкуот происходящего.Первоначально, как видно из закомментированного кода, я просто передал метод no arg load в конструктор сцены, и все работало нормально.Теперь, после добавления этого автономного javaFX 11, мой код больше не работает.Я не хочу возвращаться к javaFX 2, но застрял на этом в течение нескольких дней.Если я использую свой исходный, теперь закомментированный код, и закомментирую строку загрузки и две под ней, она прекрасно скомпилируется, хотя я получаю пустую сцену.Как можно видеть, я использую контекст приложения springs для определения бина.Если у кого-то есть идеи, я буду очень признателен.Спасибо, ребята.