JavaFX覆盖从CSS

时间:2017-01-22 13:27:28

标签: css css3 javafx javafx-8

是否可以设置JavaFX如何从CSS加载图像?如果我可以将其委托给某个实用程序类。

在Swing中我有一个ImageStore实用程序类,它加载了所有组件所需的图像。 ImageStore从给定的URL中检索图像并将其缓存到磁盘以供以后检索。它还在内存缓存中用于运行应用程序,以避免在每次检索时触摸磁盘。这样,如果100个组件想要相同的图像,则图像仅被提取1次,而不是100次。

我现在使用CSS进行样式设置是一个两难选择

-fx-background-image:url('/images/single-search.png')

如何将此加载委托给ImageStore?

JavaFX如何处理CSS中定义的图像加载?

如果JavaFX CSS自己进行一些缓存,这只会解决一个问题。它不会多次获取相同的图像。但是,我的ImageStore会将所有图像保存到文件缓存中,以便下次启动应用程序时它们也可用。

1 个答案:

答案 0 :(得分:0)

JavaFX使用它自己的缓存类:

com.sun.javafx.css.StyleManager包含用于背景图片css属性的转换器使用的Image getCachedImage(String url)方法。 (请注意,此类不是公共API的一部分。)此类似乎不会将图像写入文件,也没有办法以干净的方式替换图像的加载方式(即不使用反射或类似方法)意思是),但保留对记忆中使用的图像的引用......

当然,您可以使用自己的缓存替换CssMetaData方法返回的List getCssMetaData()对象CssMetaDataRegion对象,但是这需要扩展您想要使用缓存的Region的每个子类,并使用这些类而不是标准 val props: Properties = System.getProperties val propsScala: mutable.Map[String, String] = props.asScala val padding = " " var lenght = 0 for ((k, v) <- propsScala) if (k.length > lenght) lenght = k.length else lenght for ((k, v) <- propsScala) println(k + padding * (lenght - k.length - 1) + "| " + v) ...