1

我正在编写一个使用CanvasScala 中的类的小测试应用程序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 代码后,我有点头晕,因为我已经看到了很多不同的方法来绑定到一个事件,这是我正在使用的,设置 onMouseClicked 变量(有和没有第一个类函数),使用 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)
    }    
  }    
}
4

1 回答 1

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)
  }
}
于 2015-09-28T23:11:22.897 回答