是否可以将整个样式表包装在字符串中并将其应用于特定节点?用例是为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,因此不需要记住多个字符串。似乎流只打开了一次,但是我不知道这在所有情况下是否都成立。
随意根据需要使代码复杂化;)
这种方法的贡献归功于Jasper Potts(请参见本示例)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句