Swing 在Scala中,如何检查MouseeEvent对象上的模式匹配是否单击了特定组件?

Swing 在Scala中,如何检查MouseeEvent对象上的模式匹配是否单击了特定组件?,swing,scala,Swing,Scala,这似乎表明每个事件都是事件案例类的实例 “例如,按下按钮将创建一个事件,该事件是以下案例类的实例: 案例类按钮勾选(来源:按钮)” 1) 应用此逻辑,这是否意味着按下鼠标将创建一个事件,该事件是以下case类的实例 case class MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.ev

这似乎表明每个事件都是事件案例类的实例

“例如,按下按钮将创建一个事件,该事件是以下案例类的实例: 案例类按钮勾选(来源:按钮)”

1) 应用此逻辑,这是否意味着按下鼠标将创建一个事件,该事件是以下case类的实例

case class MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.event.MouseEvent) 
2) 要在对象上进行模式匹配以检测鼠标是否按下了特定组件,此代码正确吗

listenTo(mouse.clicks)
  reactions += {
    case MousePressed(nameOfComponent,_,_,_,_) => //some code you want to execute in response to that component being pressed //
  }
3) 我认为其他论点也可以被检查,比如说

    case MousePressed(nameOfComponent,point,modifier,3,true)
创建一个非常特定的模式:在特定点上的特定组件,在第三次单击时使用特定的修改器,并触发弹出窗口?(可能不太实用)


4) 修饰符参数的作用是什么?

您可以使用以下代码打印一行,告诉您鼠标单击的位置

listenTo(mouse.clicks)
  reactions += {
    case e:MousePressed => println("press "+e.point)
}
1) 它将创建scala.swing.event.MousePressed的实例
。正如我在评论中所说,在初始化期间使用什么构造函数并不重要,它将是具有相同字段的同一类。唯一的区别是您有一个与主构造函数对应的可用模式,因为它是一个case类

2) ,和。从形式上讲,你是正确的——特别是在这种情况下,你说:

  • “对于组件”
  • “捕获任何
    MousePressed
    事件,并通过
    nameOfComponent
    让我访问
    component
    字段(我不关心其余内容)。”
实际上,您的代码不会像您预期的那样工作,因为Swing中的事件处理程序是针对每个组件注册的,而且Scala Swing似乎遵循这种模式。这意味着,除非您明确地说,否则您将只从您使用的组件
鼠标
模块
上获取事件,并且没有其他组件,甚至它的子组件也没有

因此,如果您想收听组件本身及其直接子级(而非子级的子级),您可以添加:

contents.foreach(child => listenTo(child.mouse.clicks))
这当然是标准的Scala代码——我将把它留给您来适应您的需要

最后,对于这一点——通常最好为特定组件的特定事件定义一个模式匹配,而不是“通用”处理程序——后一种解决方案仅在少数情况下有用,比如定制组件

3) 正确,你说得对“我想通过变量
nameOfComponent
point
modifier
来匹配
鼠标按下的
point
modifier
,给我访问
组件
的权限,
触发点==true
“。最后两个称为常量模式

4) 这确实是一个单独的问题,但这次我要咬一口。它们是-这是一个特殊字段,用于存储与事件相关的标志。它们甚至与Java中的类型相同。基本上,这些数字传达了事件的额外信息。例如,如果要检查这是否是左键单击,可以使用:

import java.awt.event.{InputEvent => AWTEvent} //so that we don't confuse it with the Scala class

...

case MousePressed(_,_,AWTEvent.BUTTON1_DOWN_MASK,_,_) => ...

犯错误这次不是真的跟着你。构造函数定义如何创建一个对象——至于“多少”,每次构造函数调用总是一个。只是对于case类,你会得到一个“免费”的提取器,它会给你一个可能的模式匹配,对应于类的默认构造函数——但这些通常是不同的东西。我似乎把自己搞糊涂了。。很抱歉,我没有阅读API中MousePressed case类的标题,一直在兜圈子。这本书(上面)的引语让我很困惑。我现在修改了这个问题。。希望最后一段代码是正确的?现在的问题好多了,不过老实说,你可以自己找到答案。我并不是想劝阻你们提问,而是想鼓励你们不要害怕实验:)。