如何使用Java 9中的类加载器访问资源

时间:2018-02-13 14:16:43

标签: java javafx classloader java-9

我在eclipse中有一个gradle项目。这是我项目的结构

project structure

我在styleclass.css中有css资源scr/main/resources/css。首先,我尝试使用

访问它
scene.getStylesheets().add("css/styleclass.css"); 

但是我收到警告resource not found.我也尝试删除module-info.java文件。但结果是一样的。

然后我尝试使用

String urlString = ComboBoxStyling.class.getClassLoader().getResource("css/styleclass.css").toExternalForm();

问题是,如果我删除moduele-info.java并应用了样式表,则此行有效。但是module-info.java我得到空指针异常。

我不太了解,但至少我知道类加载器在Java 9中有变化。那么我怎么能在Java 9中做同样的事情。我的module-info.java文件包含以下内容

module pk.training.basit {
    exports pk.training.basit;
    requires transitive javafx.controls;
}

谢谢&此致

Basit Mahmood Ahmed

2 个答案:

答案 0 :(得分:1)

你应该将你的css放在与使用它的类相同的包中,然后使用Class.getResource来访问它,并使用相对的Path。

src/main/java:
  pk.training.basit
    ComboBoxStyling.java

src/main/resources:
  pk.training.basit
    ComboBoxStyling.css

然后在来源:

scene.getStylesheets().add(
  ComboBoxStyling.class.getResource("ComboBoxStyling.css").toExternalForm());

我个人认为将css和类放在同一目录中更好的做法,然后配置gradle以便它可以占用src / main目录中的资源。它允许具有类似于其他GUI产品(Angular)的体系结构,其将屏幕的所有资源(包括源)放在同一目录中,例如FXML文件(如果有的话)。

答案 1 :(得分:0)

来自func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { let point = touch.location(in: view) return !dialogView.frame.contains(point) } JavaDoc:

  

命名模块中的资源受Module.getResourceAsStream指定的封装规则的约束。此外,除了资源的名称以" .class"结尾的特殊情况之外,此方法只会在无条件打开包时找到命名模块包中的资源(即使此调用者的调用者) method与资源在同一模块中。

因此,要解决您的问题,您应该打开包ClassLoader.getResource

css