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



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

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

抛出错误:

[error] E:devsgsrcmainscalaTest.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代码,我有点头晕,因为我已经看到了很多不同的方式来绑定一个事件,有一个我正在使用,设置onmouseclick变量(带和不带第一类函数),使用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)
  }
}

相关内容

  • 没有找到相关文章

最新更新