Модуль не экспортирует исключение в javafx 12 - PullRequest
1 голос
/ 22 сентября 2019

Я использую Intellij с javafx 12, как отдельную библиотеку.Мне удалось заставить это работать.Я сделал игру, и графика отлично работает.Теперь я хотел создать меню с некоторыми кнопками.Он выдает исключение, когда я пытаюсь добавить кнопку в корень сцены, со следующим исключением:

Exception in thread "JavaFX Application Thread" java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x77b376ef) 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 @0x77b376ef

Я нашел его в Google и нашел некоторые решения по переполнению стека, которые не работают для меня,Мои аргументы командной строки следующие (основанные на этих решениях):

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
--add-modules=javafx.swing,javafx.graphics,javafx.fxml,javafx.media,javafx.web,javafx.scene,javafx.controls \
-p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
   "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \
--add-exports javafx.graphics=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.charts=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.iio.common=ALL-UNNAMED \
--add-exports  javafx.graphics/com.sun.javafx.css=ALL-UNNAMED \
--add-exports  javafx.base/com.sun.javafx.runtime=ALL-UNNAMED \
--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED \
--add-exports javafx.graphics/com.sun.javafx.scene.layout=ALL-UNNAMED

Спасибо!

Редактировать 1: минимальный воспроизводимый пример

  1. загрузить последнюю версию intellij
  2. создать новый шаблонный проект javafx
  3. добавить библиотеки javafx
  4. добавить следующую строку в аргументы командной строки в конфигурациях запуска

    -путь к модулю "C: \ Program Files \ Java \ javafx-sdk-11.0.2 \ lib" \ --add-modules javafx.fxml, javafx.controls

Примечание: пожалуйстапроверьте правильность пути к библиотекам.

Измените метод запуска следующим образом:

@ Переопределить общий запуск void (Stage primaryStage), вызывает исключение {Button button = new Button ();primaryStage.setTitle ("Hello World");primaryStage.setScene (новая сцена (новая группа (), 300, 275));primaryStage.show ();}

Важное примечание: Пожалуйста, убедитесь, что кнопка из javafx, а не из библиотеки awt! Это будет работать, если вы импортируете кнопку из awt по ошибке.

Кнопка никогда не добавляется в корень (ни в сцену), и если вы прокомментируете строку, которая создает кнопку, все работает!

Редактировать 2:

ПохожеЯ запускаю созданную мной конфигурацию, поскольку командная строка, которую создает intellij (когда я нажимаю ...), выглядит следующим образом:

"C:\Program Files\Java\jdk-12.0.2\bin\java.exe" --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\lib\idea_rt.jar=50712:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\dusan\Documents\untitled\out\production\untitled;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.web.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.swing.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.media.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.fxml.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.controls.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx-swt.jar" -p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar;C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar" sample.Main --module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \ --add-modules javafx.fxml,javafx.controls

1 Ответ

2 голосов
/ 22 сентября 2019

Ответ в вашей командной строке:

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
...
-p "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.base.jar" : \
   "C:\Program Files\Java\javafx-sdk-11.0.2\lib\javafx.graphics.jar"  \

Обратите внимание, что опция -p точно такая же, как --module-path (см. Путь к модулю приложения в JEP 261 ).

Это означает, что вы добавляете его дважды, но преобладает только последний.Таким образом, только javafx-base и javafx-graphics добавляются к пути модуля, поэтому javafx-controls нет.Это объясняет исключение (связанное с com.sun.javafx.scene.control.ControlHelper) и тот факт, что вы добавили без необходимости все эти --add-exports.

Возможно, вы не будете использовать Swing, Media или Web,поэтому этой командной строки будет более чем достаточно:

--module-path "C:\Program Files\Java\javafx-sdk-11.0.2\lib" \
--add-modules javafx.fxml,javafx.controls

Эти параметры виртуальной машины могут быть установлены в вашей среде IDE.

Все это правильно задокументировано здесь: https://openjfx.io/openjfx-docs/ (также проверьте документацию для вашей конкретной IDE).

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