当前位置: 首页 > 知识库问答 >
问题:

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

宋岳
2023-03-14

我正在编写一个小型测试应用程序,该应用程序使用Scala中的canvas类和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代码之后,我有些头晕,因为我已经看到了许多绑定到事件的不同方法,我正在使用的就是一种,使用FilterEvent设置onMouseClicked变量(有和没有第一类函数)。另外,对于每个对象,您可以使用匿名函数或创建事件处理程序对象。

在所有这些中,这是唯一一个在本例中起作用的;在这种情况下,尝试创建EventHandler[MouseEvent]并重写Handle()也会失败。

我使用的是Scala2.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个答案

韦志新
2023-03-14

在我看来,这像是Scala编译器中的一个bug,特别是您可以通过使用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)
  }
}
 类似资料:
  • 我的ScalaFX应用程序中存在以下问题。我在VBox中有一个标签。两者都分配了一个onMouseClicked侦听器,如我的示例代码所示。单击内部标签时,将执行两个处理程序。这不是我想要强迫的行为。我只希望执行标签侦听器。 示例-代码 有没有一种简单的方法可以在点击标签时阻止VBox处理程序被执行?

  • 是否可能有一个全局鼠标运动监听器,根据点击的JPanel的内容而具有不同的效果(仅使用一个鼠标运动监听器)? 例如:我有一个JFrame,其中添加了两个JPanel,并在JFrame中添加了一个鼠标运动监听器。当我点击一个JPanel时,我希望屏幕能够调整大小,但当我点击另一个JPanel时,我希望JFrame能够被拖动。我认为这可以通过使用JLabel来完成,使用JLabel的文本进行检查,与J

  • 我在Windows 7中使用Python 3.4和Pygame为我的小儿子创建了一个小游戏。它也适用于Python 2。十、 有一些小错误。然后我尝试创建一个。使用py2exe的exe文件。我准备了一个设置。py文件复制我在pygame2exe wiki上找到的源(http://www.pygame.org/wiki/Pygame2exe?parent=CookBook)还尝试使用我在这里和pyt

  • 背景:我继承了一个利用EJB的古老应用程序。在项目的方面,它被列为3.0EJB。EJB是在运行WebSphere6.1时编写的,我们有两个JVM,一个用于UI/表示层,另一个JVM托管EJB/“数据层”,该JVM也使用JPA。我们正在迁移到WebSphere Liberty 8.5.5.8,当我启动应用程序并访问它时,我遇到以下异常: 下面是访问上下文对象的代码:提供的失败字符串jndiName是

  • 问题内容: 在JavaScript中,删除使用bind()添加为事件侦听器的函数的最佳方法是什么? 例 我能想到的唯一方法是跟踪添加了bind的每个侦听器。 上面的示例使用此方法: 有没有更好的方法可以做到这一点? 问题答案: 尽管@machineghost所说的是正确的,但事件的添加和删除方式相同,但等式中缺少的部分是: 调用后会创建一个新的函数引用! 因此,要添加或删除它,请将引用分配给变量: