簡體   English   中英

具有子類節點的 ScalaFX PickResult

[英]ScalaFX PickResult with subclassed nodes

我有一個簡單的 scalafx 應用程序,但我很難讓簡單的鼠標交互工作。

我有自定義 Canvas 節點 class 稱為 Square:

case class Square(val index: Int) extends Canvas

然后我有一個用正方形填充的自定義 GridPane:

class BoardPane extends GridPane
{
  val squares: Array[Square] = (0 to 63).toArray.map(index => Square(index))
  (0 to 63).foreach(index => add(squares(index), index%8, 7-index/8))
}

當我嘗試從鼠標事件中獲取選擇結果時:

class PlayableBoardPane extends BoardPane
{
  onMouseDragged = (event => {
    val node: Option[Node] = event.pickResult.intersectedNode
  ...
  })
}

相交節點不是 Square 而是“scalafx.scene.LowerPriorityIncludes$$anon$4”(帶有隱式轉換)

有沒有辦法讓 map 這個節點回到我的方塊?

沒有它,我根本看不到如何將節點拾取與子類節點一起使用。

請記住,ScalaFX 可以幫助您構建 JavaFX 應用程序 - 底層結構是 JavaFX。 也就是說,當您在 ScalaFX 中構建場景圖時,它由 JavaFX 對象組成。

出於這個原因,ScalaFX 應用程序應該構建槽組合而不是 inheritance。 當您簡單地從 ScalaFX 包裝器繼承時,例如在您的示例中:

    case class Square(val index: Int) extends Canvas

它擴展了一個包裝器,而不是實際的 JavaFX class。 當您構建場景圖並通過拾取檢查它時,您將看到 JavaFX 對象而不是您創建的包裝器。 你可以通過各種方式來處理它。 一個簡單的方法是設置傳遞給底層 JavaFX object 的userData 我從你提出的片段中完成的例子是這樣的:

import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene
import scalafx.scene.canvas.Canvas
import scalafx.scene.layout.GridPane

object PickResultWithSubclassedNodes extends JFXApp {

  case class Square(index: Int) extends Canvas {
    height = 25
    width = 25
    userData = index.toString
  }

  class BoardPane extends GridPane {
    val squares: Array[Square] = (0 to 63).toArray.map(index => Square(index))
    (0 to 63).foreach(index => add(squares(index), index % 8, 7 - index / 8))
  }

  class PlayableBoardPane extends BoardPane {
    onMouseReleased = (event => {
      val node = event.pickResult.intersectedNode
      node match {
        case Some(n) => println("Picked: " + n.userData)
        case None =>
      }
    })
  }

  stage = new PrimaryStage {
    title = "Blocking"
    scene = new Scene {
      root = new PlayableBoardPane()
    }
  }
}

單擊 window 將生成 output 如下所示:

Picked: 40
Picked: 42
Picked: 17
Picked: 36
Picked: 52
Picked: 38
Picked: 27

不尋常的隱式類沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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