Я использую JavaFx 11 и gradle для модулей javafx, когда я запускаю приложение из другого класса, кроме самого класса приложения, все работает нормально, но я хочу запустить приложение в главном классе класса Application и затем создать сцена в другом. Это мой рабочий пример
Основной класс, из которого я вызываю запуск:
public class RestaurantApplication{
public static void main(String[] args) {
Application.launch(StageManager.class, args);
}
}
Класс приложения:
public class StageManager extends Application {
public void start(Stage primaryStage) throws Exception {
currentStage = initializeFirstLoginStyle(primaryStage);
}
private Stage initializeFirstLoginStyle(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
Pane root = loader.load();
...
}
}
При таком подходе все работает, но когда Я пытаюсь запустить приложение в том же классе, что и приложение, которое оно мне выдает. Ошибка:
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x71d2156a) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x71d2156a
at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
Это подход с ошибкой:
Основной класс, который теперь запускается, который вызов другого класса для создания моей сцены:
public class RestaurantApplication extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
StageManager stageManager = new StageManager();
stageManager.initializeStages(primaryStage);
}
public static void main(String[] args) {
Application.launch(args);
}
}
класс сцены:
public class StageManager extends RestaurantApplication {
public void initializeStages(Stage primaryStage) throws Exception {
currentStage = initializeFirstLoginStyle(primaryStage);
currentStage.show();
}
private Stage initializeFirstLoginStyle(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
Pane root = loader.load();
...
Также мой gradle:
plugins {
id 'java'
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.7'
}
group 'fda'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
compile group: 'org.json', name: 'json', version: '20180813'
compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'
compile group: 'commons-io', name: 'commons-io', version: '2.6'
compile group: 'org.kohsuke', name: 'github-api', version: '1.93'
compile group: 'com.1stleg', name: 'jnativehook', version: '2.1.0'
compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.3'
testCompile group: 'org.slf4j', name: 'slf4j-simple', version: '1.6.1'
compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8'
}
javafx {
modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.media' ]
}
Та же ошибка присутствует, даже если я попробуйте создать этап в классе Application:
public class RestaurantApplication extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
Pane root = loader.load();
}
public static void main(String[] args) {
Application.launch(args);
}
}
Так что единственный подход, который работает, - это если я вызову другой класс в launch (). Но в целом это должно работать в обе стороны. Это ошибка Gradle?