Хотя существует проблема с JFoenix 9.0.8 и Java 12 (использование небезопасного в некоторых компонентах, таких как JFXTextField
), эта проблема не препятствует запуску компонента JFXTabPane
с Javaи JavaFX 12.0.1.
На основе этого образца helloFX я отредактировал его файл FXML, включив в него JFXTabPane
с одной вкладкой:
И пом выглядит так:
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>12.0.1</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>12.0.1</version>
</dependency>
<dependency>
<groupId>com.jfoenix</groupId>
<artifactId>jfoenix</artifactId>
<version>9.0.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>12</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.2</version>
<configuration>
<mainClass>org.openjfx.App</mainClass>
</configuration>
</plugin>
</plugins>
</build>
Однако при запуске mvn clean javafx:run
я получаю сообщение об исключении:
Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin \
(in module com.jfoenix) cannot access class com.sun.javafx.scene.control.behavior.TabPaneBehavior \
(in module javafx.controls) because module javafx.controls \
does not export com.sun.javafx.scene.control.behavior to module com.jfoenix
Такследуя совету, я изменю javafx-maven-plugin
, чтобы избежать его:
<configuration>
<mainClass>org.openjfx.App</mainClass>
<options>
<option>--add-opens</option>
<option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix</option>
</options>
</configuration>
Сейчас выполняется mvn clean javafx:run
Я получаю новое исключение:
Caused by: java.lang.IllegalAccessError: class com.jfoenix.skins.JFXTabPaneSkin$TabHeaderContainer (in module com.jfoenix) \
cannot access class com.sun.javafx.scene.control.LambdaMultiplePropertyChangeListenerHandler \
(in module javafx.controls) because \
module javafx.controls does not export com.sun.javafx.scene.control to module com.jfoenix
Итак, мы добавляем этот новыйопция для плагина:
<configuration>
<mainClass>org.openjfx.App</mainClass>
<options>
<option>--add-opens</option>
<option>javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix</option>
<option>--add-opens</option>
<option>javafx.controls/com.sun.javafx.scene.control=com.jfoenix</option>
</options>
</configuration>
Наконец, mvn clean javafx:run
работает нормально:
Обратите внимание, что если вы этого не сделаетеиспользовать плагин, вы также можете запустить в командной строке, что-то вроде:
java \
--add-opens javafx.controls/com.sun.javafx.scene.control.behavior=com.jfoenix \
--add-opens javafx.controls/com.sun.javafx.scene.control=com.jfoenix \
--module-path /Users/user/.m2/repository/com/jfoenix/jfoenix/9.0.8/jfoenix-9.0.8.jar:\
/Users/user/javafx-sdk-12.0.1/lib \
--add-modules com.jfoenix,javafx.controls,javafx.fxml \
-classpath hellofx/target/classes \
org.openjfx.App
Если вы проверите эту командную строку, вы заметите, что у вас отсутствовал модуль com.jfoenix
из --add-modules
, и чтообъяснил бы почему тыr "--add-opens" не работает.