получение java.lang.reflect.InvocationTargetException при добавлении кнопки в макет - PullRequest
0 голосов
/ 11 января 2019

Я совершенно новый в javafx! Я попробовал очень очень простой код, и я застрял. при попытке добавить кнопку в макет не работает. Я знаю, что этот вопрос может быть слишком простым, но я действительно не знаю, как это исправить. Я был бы признателен, если бы вы могли мне помочь. Это мой код:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Test extends Application{

    Button button;

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

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("Title");
        StackPane layout = new StackPane();

        button = new Button();
        layout.getChildren().add(button);
        Scene scene = new Scene(layout);
        stage.setScene(scene);
        stage.show();
    }
}

и я получил ошибку:

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.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x46b3f4cf) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x46b3f4cf
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at javafx.scene.control.Control.<clinit>(Control.java:86)
    at Test.start(Test.java:21)
    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 Test

1 Ответ

0 голосов
/ 11 января 2019

Из-за ошибки я предполагаю, что вы используете JavaFX 11 (или, по крайней мере, JavaFX 9+). Обратите внимание, что основной проблемой является не InvocationTargetException, а IllegalAccessError:

Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x46b3f4cf) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x46b3f4cf

Это говорит о том, что код в «неназванном модуле» пытается получить доступ к внутренним компонентам модуля javafx.graphics. Так как это не разрешено, выдается ошибка. Но настоящая проблема здесь в том, что ControlHelper находится в безымянном модуле, но предполагается, что находится в модуле javafx.controls, если имя пакета является чем-то, что нужно пройти. Эта проблема вызвана наличием javafx.graphics на modulepath , но javafx.controls на classpath .

Убедитесь, что на --module-path установлены оба модуля (и javafx.base). Поскольку ваш код не является модульным (нет файла module-info), вам также придется указать системе модулей разрешить его, используя:

--add-modules javafx.controls

Вам не нужно включать javafx.graphics в команду --add-modules, потому что javafx.controls требует javafx.graphicsjavafx.graphics требует javafx.base). Поскольку все модули находятся на пути модуля, они будут разрешены.

То, как вы устанавливаете эти команды, зависит от того, как вы запускаете приложение (например, из командной строки, IDE, Maven, Gradle и т. Д.).

Если вы когда-нибудь сделаете свой код модульным, вам не нужно будет использовать команду --add-modules, просто поместите соответствующие директивы requires в ваш файл module-info. Например:

module app {
    requires javafx.controls;
}
...