尝试在 ScalaFx 中绑定鼠标事件侦听器时出现编译错误

Compile error trying to bind mouse event listener in ScalaFx

我正在编写一个小测试应用程序,它在 Scala 中使用 Canvas class 和 scalafx。问题在于:

gui.canvas.handleEvent(MouseEvent.MouseClicked){
     a: MouseEvent => {
          println("Mouse pos:" + a.sceneX+ "  " + a.sceneY)
     }      
}

抛出错误:

[error] E:\dev\sg\src\main\scala\Test.scala:27: type mismatch;
[error]  found   : scalafx.scene.input.MouseEvent => Unit
[error]  required: _2.HandlerMagnet[javafx.scene.input.MouseEvent,?] 
where val _2: scalafx.scene.canvas.Canvas
[error]       a: MouseEvent => {
[error]                     ^

我不明白为什么这个完全相同的片段出现在方法 setupGraphics 中时可以编译,但当它出现在 Main 对象的代码中时却不能编译。

顺便说一句,浏览了相当多的 ScalaFX 代码后,我有点头晕,因为我看到了很多不同的绑定事件的方法,有 the one I'm using, setting the onMouseClicked variable (with and without a first class function), using filterEvent。此外,对于每个,您都可以使用匿名函数或创建事件处理程序对象。

在所有这些中,这是唯一在此示例中起作用的;在这种情况下,尝试创建 EventHandler[MouseEvent] 并覆盖 handle() 也会失败。

我正在使用 Scala 2.10.5

完整来源:

object Test {
  import scalafx.Includes._
  import scalafx.application.JFXApp
  import scalafx.application.JFXApp.PrimaryStage
  import scalafx.stage.Stage

  import scalafx.scene.Scene
  import scalafx.scene.canvas.Canvas
  import scalafx.scene.canvas.GraphicsContext

  import scalafx.scene.input.MouseEvent
  import scalafx.event.EventHandler



  class GUI(val canvas:Canvas
    ,val stage: Stage
    ,val gc: GraphicsContext){}

  object Main extends JFXApp {

    var gui=setupGraphics()

    gui.canvas.handleEvent(MouseEvent.MouseClicked){
      a: MouseEvent => {
        println("Mouse pos:" + a.sceneX+ "  " + a.sceneY)
      }
    }

    def setupGraphics():GUI={
      val canvas = new Canvas(400, 400)
      canvas.translateX=0
      canvas.translateY=0
      val gc = canvas.graphicsContext2D

      canvas.handleEvent(MouseEvent.MouseClicked){
        a: MouseEvent => {
          println("Mouse pos:" + a.sceneX+ "  " + a.sceneY)
        }
      }

      stage = new PrimaryStage {
        title = "asd"
        height = 600
        width = 800
        scene=new Scene{content=canvas}
      }

      return new GUI(canvas,stage,gc)
    }    
  }    
}

在我看来,这就像是 Scala 编译器中的错误,尤其是您可以通过使用 canvas 的中间变量来更正此错误,而无需修改任何其他内容。不要调用 gui.canvas.handleEvent,而是先将 canvas 赋值给一个变量,然后对其调用 handleEvent

var gui=setupGraphics()
val canvas = gui.canvas
canvas.handleEvent(MouseEvent.MouseClicked){
  a: MouseEvent => {
    println("Mouse pos:" + a.sceneX+ "  " + a.sceneY)
  }
}