JavaFXML Spring Controller Factory - PullRequest
       1

JavaFXML Spring Controller Factory

0 голосов
/ 25 февраля 2019

У меня есть проект 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 для определения бина.Если у кого-то есть идеи, я буду очень признателен.Спасибо, ребята.

1 Ответ

0 голосов
/ 26 февраля 2019

Вы действительно пошли дальше и перестроили весь код с помощью java 11 jdk?

Если нет, то это первое, что я попробую.Сделайте ли maven чистую установку, эквивалентную используемому вами средству сборки.

Также Как исправить ошибку NoSuchMethodError? стоит проверки, в частности, обратите внимание на ответы Криса Дутроу иматовый б.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...