【发布时间】:2014-05-01 05:28:43
【问题描述】:
我有一个myNode: scalafx.scene.Node,我想将其转换为位图,以便将其保存到磁盘,将其与其他位图进行比较等。我认为将其转换为scalafx.scene.image.WritableImage 的正确代码是
val writableImg = new Scene { root = new Group(myNode) }.snapshot(null)
然后我应该可以把它变成java.awt.image.RenderedImage
val renderedImg = SwingFXUtils.fromFXImage(writableImg, null)
您可能已经意识到,问题是我必须运行代码才能在 ScalaFX 线程上获取 wrImg。有一个问题here 解释了如何返回一个值,但我没有运气将它翻译成 Scala。我试过这个:
lazy val writableImg: WritableImage = {
val wrImg = new FutureTask(new Callable[WritableImage]() {
override def call(): WritableImage = {
new Scene { root = new Group(myNode) }.snapshot(null)
}
})
Platform.runLater(wrImg)
wrImg.get()
}
但代码只是挂起并且永远不会完成。谁能提供一个惯用的 Scala 版本和/或告诉我为什么代码永远不会返回?
【问题讨论】:
-
好吧,这很奇怪...
myNode依赖于lazy val。我取出了lazy部分,现在一切正常。这是意料之中的,还是我在处理lazy vals 的方式上遇到了错误?
标签: multithreading scala javafx-2 future scalafx