2012-12-19 74 views
9

语言:JavaFX的添加CSS文件样式表的JavaFX

IDE:Netbeans的

问题:我想一个CSS文件添加到样式表,但下面的代码的第一行总是产生一个NullPointerException

String css = this.getClass().getResource("double_slider.css").toExternalForm(); 
scene.getStylesheets().add(css); 

我试过用完整路径替换“double_slider.css”。 double_slider.css当前与进行此调用的类位于同一个包中。我也试过在http://introjava.wordpress.com/2012/03/21/linking-a-css-style-sheet-to-javafx-scene-graph/找到的所有变化,但没有成功。清洁和构建也没有帮助。

如果我把在.class文件转储的生成文件夹中的CSS文件,该NullPointerException异常消失。但是,然后该CSS文件无法正常工作,因为它引用了我的项目中的其他文件。

+0

如何您的应用程序构建,部署和执行? – jewelsea

回答

0

嗯,你是在Netbeans的?尝试“清理并生成”项目。

+0

是的,我正在使用Netbeans。我尝试了多次“清理和构建”,但并未解决问题。 – Danielle

+0

@Danielle。下列哪一行生成NullPointerException:1)'String css = this.getClass()。getResource(“double_slider.css”)。toExternalForm();'2)'scene.getStylesheets()。add(css);'。如果仍然在第二,那么你需要提供更多的细节。或者在Netbeans中创建一个新的小项目,然后重新加载你的css文件。 –

+1

NullPointerException由第一行生成。 – Danielle

0

你有没有初始化之前设置样式表中的场景对象?

场景=新场景(myRootLayout,600,600); //例如

+0

是的,场景已经初始化 – Danielle

+0

我在使用CSS时遇到了类似的问题,我很难记住什么是错误的。初始化场景是抛出空指针异常的一种方法。 – medokr

+0

您粘贴了吗?上面的代码直接来自你的源代码?double_slider.css的引号看起来很尴尬。你可以尝试重新输入这些引号。可能是一个奇怪的建议。代码似乎对我来说是正确的 – medokr

9

我认为你错过了导致CSS文件无法找到的斜杠。尝试更正您的路径参考。

例如:

-root 
--app/Main.java 
--assets/double_slider.css 

是:

String css = this.getClass().getResource("/assets/double_slider.css").toExternalForm(); 
+1

为什么我们需要使用toExternalForm();方法在最后? – UnKnown

+0

@UnKnown'node.getStylesheets()。add()'不接受'URL'对象作为参数'toExter nalForm()'将其表示为字符串。 – KeepMove

+0

来自JavaDoc:“[path]的任何前导'/'字符将被忽略,并且[path]被视为相对于应用程序类路径根目录的路径。” – Line

5

我有同样的问题。我在Win7上使用NetBeans 7.3和JavaFX 2.2.7,JDK 7.0_21。

我的解决办法是在SAME文件夹中的.css将含有无效开始(第一阶段阶段)我的Java文件。因此,项目视图看起来是这样的:

  • 项目名
    • 源包
      • pkgWhatever
        • Main.java
        • MyCssFile.css

(所以CSS文件是IN包,我觉得这真的很奇怪,contraintuitive。一些文档叫我把它放在项目的根目录,因此它可以在运行时被发现,但并没有为我在NB工作。我的应用程序现在通过按Ctrl键+ü单击项目的上下文菜单上的运行运行,无论是否我开始包含文件“开始(..)”。而且这不会不管我让NB把一切都变成JAR或不)

下面是加载CSS在上述情况下的代码:

URL url = this.getClass().getResource("controlStyle1.css"); 
    if (url == null) { 
     System.out.println("Resource not found. Aborting."); 
     System.exit(-1); 
    } 
    String css = url.toExternalForm(); 
    scene.getStylesheets().add(css); 

然而这并不工作:

scene.getStylesheets().add("controlStyle1.css"); 

希望这有助于。

+0

您的解决方案为我工作,谢谢。 – FirstLegion

9

把你的yourname.css文件直接在src目录下。

scene.getStylesheets().add("yourname.css") 

干净的构建需要

+0

我认为如果你把它放在一个子目录中,它会更美丽和清晰。不直接在'/ src'下 –

0

这是非常简单的。

this.scene.setUserAgentStylesheet(/resources/blabla.css); 

这是什么工作了我 -

3

我有同样的问题(在NetBeans 8)。我发现了一个解决方案在这里:https://blog.idrsolutions.com/2014/04/use-external-css-files-javafx/

我的资源文件spreadsheet.css在这里:

MyApp 
-resources 
--spreadsheet.css 
-source packages 
--fr.ccc.myapp.view 
---mainView.java 
---FXMLMain.fxml 

在mainView.java:

File f = new File("resources/spreadsheet.css"); 
spreadsheet.getStylesheets().add("file:///" + f.getAbsolutePath().replace("\\", "/")); 

希望这有助于。

0

考虑您的旧代码:

String css =this.getClass().getResource("double_slider.css").toExternalForm(); 
scene.getStylesheets().add(css); 

尝试将其更改为这个新的代码,它会工作:

screen.getStylesheets().add(getClass().getResource("double_slider.css").toExternalForm()); 

当您使用getClass(),你并不需要使用this关键字。

我希望为你工作。 :)

0

在文件的.java使用本

Application.setUserAgentStylesheet(getClass().getResource("application.css") 
       .toExternalForm()); 
2

您可以直接在.fxml文件属性到根元素添加您的style.css因为这样式=“@ your_relative_path/style.css文件”。

您可以使用@ ../style.css中,如果你要访问的css文件是在src目录