这个书似乎暗示每个事件都是事件案例类的实例。
例如,按一个按钮将创建一个事件,它是以下case类的实例: case类ButtonClicked(源:按钮)
1)应用此逻辑,这是否意味着按鼠标将创建一个事件,该事件是以下案例类的实例?:
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)修饰语的论点是什么?
发布于 2014-02-16 09:20:34
1) scala.swing.event.MousePressed. --它将创建实例正如我在注释中所说的,在初始化过程中使用什么构造函数并不重要,它将是具有相同字段的同一个类。唯一的区别是,您有一个与主构造函数相对应的可用模式,因为它是一个case类。
( 2) 是,no。从形式上讲,你是对的--尤其是在这种情况下,你会说:
MousePressed事件,并允许我通过nameOfComponent访问component字段(我不关心其余的)。”实际上,您的代码不会像您预期的那样工作,因为Swing中的事件处理程序是在每个组件中注册的,而且Scala似乎遵循这种模式。这意味着,除非您明确地说,您将只从您使用过mouse的组件listenTo模块中获取事件--并且没有其他组件,甚至是子组件。
因此,如果您想要侦听组件本身及其直接子组件(而不是子组件),您可以添加:
contents.foreach(child => listenTo(child.mouse.clicks))当然,这是标准的Scala代码--我将留给您来调整它以适应您的需要。
最后,对于这一点--通常最好为特定组件定义特定事件的模式匹配,而不是“通用”处理程序--后一种解决方案只在少数情况下有用,比如定制组件。
3) 正确,这里的:"I to match MousePressed,让我通过变量nameOfComponent、point和modifier访问component、point和modifier字段,并且我希望匹配的事件具有clicks == 3和triggersPopup == true“。后两者称为常量模式。
4)这确实是另外一个问题,但这次我会咬人的。它们是和Java的Swing一样 --这是一个特殊的字段,用于存储与事件相关的标志。它们甚至与Java-Int中的类型相同。基本上,这些数字传达了更多关于事件的信息。例如,如果要检查这是否是左键,可以使用:
import java.awt.event.{InputEvent => AWTEvent} //so that we don't confuse it with the Scala class
...
case MousePressed(_,_,AWTEvent.BUTTON1_DOWN_MASK,_,_) => ...发布于 2014-02-16 01:30:51
您可以使用下面的代码打印一行,告诉您鼠标单击的位置。
listenTo(mouse.clicks)
reactions += {
case e:MousePressed => println("press "+e.point)
}https://stackoverflow.com/questions/21805159
复制相似问题