FXMLLoader.load () отлично работает в стиле до java 9, но не работает в модулях - PullRequest
0 голосов
/ 25 октября 2018

Я успешно создал простую программу JavaFX FXML (в стиле до Java 9, а не в модуле). Я использовал 3 файла и основной класс, как показано ниже:

└───javafxfxmldemo
        FXMLDocument.fxml
        FXMLDocumentController.java
        JavaFXFXMLDemo.java

Основной класс

public class JavaFXFXMLDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Он отлично работает как в NetBeans 9, так и в терминале DOS с javac и java.

Теперь я попытался создать одну и ту же программу в модулях Java.Ниже приведена моя исходная структура:

└───src
    └───com.fxmlapp
        │   module-info.java
        │
        └───com
            └───fxmlapp
                    FXEventModuleDemo.java
                    FXMLDocument.fxml
                    FXMLDocumentController.java

module-info.java

module com.fxmlapp {
    requires javafx.controls;
    requires javafx.fxml;

    exports com.fxmlapp;
}

Весь остальной код идентичен, кроме имени основного класса.

Компилируетсяв NetBeans 9 и я также мог бы скомпилировать в терминале DOS, как показано ниже:

javac -d mods\com.fxmlapp --module-path %PATH_TO_FX% src\com.fxmlapp\module-info.java src\com.fxmlapp\com\fxmlapp\FXEventModuleDemo.java src\com.fxmlapp\com\fxmlapp\FXMLDocumentController.java

После компиляции я поместил файл FXMLDocument.fxml в каталог модов, как показано ниже.

├───mods
│   └───com.fxmlapp
│       │   module-info.class
│       │
│       └───com
│           └───fxmlapp
│                   FXEventModuleDemo.class
│                   FXMLDocument.fxml
│                   FXMLDocumentController.class
│
└───src
    └───com.fxmlapp
        │   module-info.java
        │
        └───com
            └───fxmlapp
                    FXEventModuleDemo.java
                    FXMLDocument.fxml
                    FXMLDocumentController.java

Но он не запускается.Я пробовал как в NetBeans 9, так и в DOS-терминале, как показано ниже:

java --module-path %PATH_TO_FX%;mods -m com.fxmlapp/com.fxmlapp.FXEventModuleDemo

Ошибка исходит из утверждения:

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

Я знаю, есть много сообщений с этой проблемой, ноЯ не мог найти решение этого, когда ошибка происходит в Java-модулях.Я не думаю, что это проблема с расположением файла, потому что ниже работает оператор.

System.out.println(getClass().getResource("FXMLDocument.fxml"));

FXMLLoader.load () , кажется, не работает в модулях.

Если он работает в немодульном стиле, я считаю, что он должен работать и в модулях.

Фактическое сообщение об ошибке приведено ниже;Да, я видел много вопросов, задаваемых с этой ошибкой, но я все еще не мог найти решение с помощью java-модулей.) Что-то не так с моим module-info.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: javafx.fxml.LoadException:
/D:/OpenJFX_Demo/FXEventModuleDemo/mods/com.fxmlapp/com/fxmlapp/FXMLDocument.fxml:14

        at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
        at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
        at com.fxmlapp/com.fxmlapp.FXEventModuleDemo.start(FXEventModuleDemo.java:13)
        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
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private javafx.scene.control.Label com.fxmlapp.FXMLDocumentController.label accessible: module com.fxmlapp does not "opens com.fxmlapp" to module javafx.fxml
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:340)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:280)
        at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
        at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.addAccessibleFields(FXMLLoader.java:3479)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.access$3900(FXMLLoader.java:3328)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor$1.run(FXMLLoader.java:3444)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor$1.run(FXMLLoader.java:3440)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.addAccessibleMembers(FXMLLoader.java:3439)
        at javafx.fxml/javafx.fxml.FXMLLoader$ControllerAccessor.getControllerFields(FXMLLoader.java:3378)
        at javafx.fxml/javafx.fxml.FXMLLoader.injectFields(FXMLLoader.java:1170)
        at javafx.fxml/javafx.fxml.FXMLLoader.access$1600(FXMLLoader.java:105)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processValue(FXMLLoader.java:865)
        at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:759)
        at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
        at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
        ... 17 more
Exception running application com.fxmlapp.FXEventModuleDemo

1 Ответ

0 голосов
/ 03 ноября 2018

Как объясняется @ nullpointer :

Ошибка говорит о том, что модуль com.fxmlapp не «открывает com.fxmlapp» для модуля javafx.fxml .

Итак, я добавил - добавить-открыть com.fxmlapp / com.fxmlapp = javafx.fxml .Это решило проблему.

...