簡體   English   中英

如何從ScalaFX線程獲取值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM