Swing 在Scala中,如何检查MouseeEvent对象上的模式匹配是否单击了特定组件?
这似乎表明每个事件都是事件案例类的实例 “例如,按下按钮将创建一个事件,该事件是以下案例类的实例: 案例类按钮勾选(来源:按钮)” 1) 应用此逻辑,这是否意味着按下鼠标将创建一个事件,该事件是以下case类的实例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
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
鼠标模块上获取事件,并且没有其他组件,甚至它的子组件也没有
因此,如果您想收听组件本身及其直接子级(而非子级的子级),您可以添加:
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类的标题,一直在兜圈子。这本书(上面)的引语让我很困惑。我现在修改了这个问题。。希望最后一段代码是正确的?现在的问题好多了,不过老实说,你可以自己找到答案。我并不是想劝阻你们提问,而是想鼓励你们不要害怕实验:)。