尝试在“测试”文件夹中制作jfx应用程序时发生IllegalAccessError

时间:2019-07-29 19:46:05

标签: java module fxml fxmlloader openjfx

//上下文,如果您不感兴趣,请废话

我正在构建一个Javafx应用程序,我想在其中使用“初始化窗口”,然后单击“开始”后使用另一个窗口。我已经使应用程序的另一个窗口部分工作了,但是我认为我想更改它的某些部分。 除了要弄乱整个代码之外,我还想使用Test文件夹来检查我的GUI是否正在寻找应有的方式。 无论如何,如果可以检查是否有与gui相关的bug,无论是GUI还是逻辑,我都认为这是一个很好的测试。 我正在使用fxml tho。

//实际问题

所以: 我有一个使用GUI包(及其所有组件)的已工作应用程序,用于处理gui。当我尝试在Test文件夹(由IntelliJ创建)中使用几乎相同的代码时,我最终得到

“ java.lang.IllegalAccessError:com.sun.javafx.fxml.FXMLLoaderHelper类(未命名模块@ 0x26212a9c)无法访问com.sun.javafx.util.Utils类(在javafx.graphics模块中),因为模块javafx。图形不会将com.sun.javafx.util导出到未命名的模块@ 0x26212a9c“

我试图在这里找到答案。我通常至少要花3个小时才能写出问题之前要找到答案,尽管这并不意味着我不仅对自己的Google关键字不走运。 我一直收到同样的消息:“ jfx不再是SDK的一部分”,但是如果那是我的问题,那么我将无法首先运行任何与javafx相关的东西。 (我使用Maven,我不知道这是不是问题所在。)

根据我的其他Google匹配,该问题与Java 9和模块有关,我对此一无所知 (很明显,我阅读了所有关于该主题的文章以及其他页面,但没有解决我的问题)

我的猜测是,由于处于测试文件夹中,因此我无法正确导入某些内容,但这只是运行时问题,因此听起来很愚蠢。

//这是我要运行的应用程序:

public class GUItest extends Application {

private static TestController controller;

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

@Override
public void start(Stage mainWindow) throws IOException {
    mainWindow.setOnCloseRequest(n -> System.exit(0));
    controller = new InitTestController(mainWindow);
    URI uri = new File(/*path*/).toURI();

// I couldn't make it work with getclass().getresources()
// I don't think that can be a problem, if this works on non-test         
//folders.
    FXMLLoader loader = new FXMLLoader(uri.toURL());

// this is deliberate, so I can give the Controller class it's         
// mainWindow although it's probably not the best way to do so, 
// feel free to suggest a better solution

    loader.setController(controller); 
    controller.init(loader.load());
}
}

//,这是TestController: //这在main上看起来相同,只是名称不同,还有更多@fxmls

public class TestController implements Initializable {

public TestController(){}

private final Integer width = 400;
private final Integer height = 300;

@FXML
private Button startButton;
private Stage mainWindow;



public TestController(Stage mainWindow){
    this.mainWindow = mainWindow;
}

public void init(Parent root) throws IOException {
    mainWindow.setTitle("initializer window");
    mainWindow.setScene(new Scene(root, width, height));
    mainWindow.show();
}

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    //empty
}
}

当我弄乱主文件夹中正在工作的主应用程序时,此完全相同的代码可以正常工作。 但是,当我将其放入测试文件夹时,它突然坏了。

0 个答案:

没有答案