[英]How can I get a value from a the ScalaFX thread?
我有一個myNode: scalafx.scene.Node
,我想把它變成一個位圖,這樣我就可以將它保存到磁盤,將它與其他位圖進行比較,等等。我認為將它轉換為scalafx.scene.image.WritableImage
的正確代碼scalafx.scene.image.WritableImage
是
val writableImg = new Scene { root = new Group(myNode) }.snapshot(null)
然后我應該能夠將其變成帶有的java.awt.image.RenderedImage
val renderedImg = SwingFXUtils.fromFXImage(writableImg, null)
這個問題,因為你可能已經意識到,是我有運行代碼來獲得wrImg
的ScalaFX線程。 有一個問題在這里 ,說明如何返回一個值,但我沒有任何運氣翻譯,為斯卡拉。 我試過這個:
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版本和/或告訴我為什么代碼永遠不會返回?
如果您只想將圖像保存到磁盤,只需在同一個線程上執行即可避免復雜化傳遞圖像。 這樣的東西會起作用:
Platform.runLater {
val node = new Circle {
centerX = 200
centerY = 200
radius = 50
stroke = Color.BROWN
strokeWidth = 2
fill = Color.DARKKHAKI
}
val jfxImage = node.snapshot(new SnapshotParameters(), null)
val bufferedImage = SwingFXUtils.fromFXImage(jfxImage, null)
val file = new File("./snapshot.png")
println("Writing snapshot to: " + file.getAbsolutePath)
javax.imageio.ImageIO.write(bufferedImage, "png", file)
()
}
empty ()
有關閉返回Unit,所以ScalaFX Platform.runLater
很高興。
更新 :
如果你想從Platform.runLater
獲得一個值,你在問題中建議的方法一般應該沒問題。 但是,您要確保不阻止FX應用程序線程。 如果你在FX應用程序線程上調用Platform.runLater
,你將會鎖定,所以你可能想要這樣的東西
def makeSnapshot() = myNode.snapshot(new SnapshotParameters(), null)
val writableImg = if (Platform.isFxApplicationThread) {
makeSnapshot()
} else {
val futureTask = new FutureTask(new Callable[WritableImage]() {
override def call(): WritableImage = makeSnapshot()
})
Platform.runLater(futureTask)
futureTask.get()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.