是否可以将整个样式表包装在一个字符串中并将其应用于某个节点?
用例是为PseudoClass添加特定(非变化)行为.
我知道我可以使用pane.getStylesheets().add(getClass().getResource(“mycss.css”).toExternalForm());,但我想知道是否有某种方法可以直接在源代码中嵌入它;一些事情:
用例是为PseudoClass添加特定(非变化)行为.
我知道我可以使用pane.getStylesheets().add(getClass().getResource(“mycss.css”).toExternalForm());,但我想知道是否有某种方法可以直接在源代码中嵌入它;一些事情:
pane.getStylesheets().add( ".button:ok { -fx-background-color: green; }\n"+ ".button:ko { -fx-background-color: red; }");
解决方法
我通过定义新的URL连接找到了一种方法:
private String css; public void initialize() { ... // to be done only once. URL.setURLStreamHandlerFactory(new StringURLStreamHandlerFactory()); ... } private void updateCss(Node node) { // can be done multiple times. css = createCSS(); node.getStylesheets().setAll("internal:"+System.nanoTime()+"stylesheet.css"); } private class StringURLConnection extends URLConnection { public StringURLConnection(URL url){ super(url); } @Override public void connect() throws IOException {} @Override public InputStream getInputStream() throws IOException { return new StringBufferInputStream(css); } } private class StringURLStreamHandlerFactory implements URLStreamHandlerFactory { URLStreamHandler streamHandler = new URLStreamHandler(){ @Override protected URLConnection openConnection(URL url) throws IOException { if (url.toString().toLowerCase().endsWith(".css")) { return new StringURLConnection(url); } throw new FileNotFoundException(); } }; @Override public URLStreamHandler createURLStreamHandler(String protocol) { if ("internal".equals(protocol)) { return streamHandler; } return null; } }
协议“内部”显然可以是任何(非冲突)格式良好的字符串,并且(在这个简单的示例中)文件路径被强制忽略.
我用它来设置全局.css,所以我不需要记住多个字符串.
似乎Stream只打开一次,但我不知道在所有情况下是否都适用.
随意根据需要使代码复杂化;)
这种方法的功劳归于Jasper Potts(see this example)