css – 在JavaFX 8中,我可以从String中提供样式表吗?

前端之家收集整理的这篇文章主要介绍了css – 在JavaFX 8中,我可以从String中提供样式表吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否可以将整个样式表包装在一个字符串中并将其应用于某个节点?
用例是为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)

猜你在找的CSS相关文章