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

时间:2015-09-26 04:13:35

标签: scala event-handling mouseevent scalafx

我正在使用Canvas在Scala中使用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对象的代码中进行编译。

BTW,浏览过相当多的ScalaFX代码后,我感到有些晕眩,因为我已经看到很多不同的方法来绑定事件,那里有the one I'm usingsetting the onMouseClicked variable(有和没有第一类函数),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)
    }    
  }    
}

1 个答案:

答案 0 :(得分:1)

这看起来像是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)
  }
}