我是一个玩scala-swing的scala新手。并希望在scala.swing.Point
上翻译给定的scala.swing.event.MousEvent
:
我想将鼠标事件发送给负责处理形状选择的类。但是因为一个形状相对于他的容器( sheet )有一个位置,但是MouseEvent.point是相对于窗口的,我应该在之前翻译/重新激活它。
所以,我有一个Selection
班,他们收到MouseEvent
s:
case class Selection(sheet:Sheet) {
def on(event:Event) = event match {
case clicked:MouseClicked => {
clicked.modifiers match {
case scala.swing.event.Key.Modifier.Control =>
sheet.getItemAt(clicked.point).map(addToSelection)
case _ =>
sheet.getItemAt(clicked.point).map(setSelection)
}
}
}
}
一个Sheet
他的形状容器(并且知道如何翻译点)。
class Sheet extends Component {
private val selection = Selection(this)
listenTo(mouse.clicks, mouse.moves)
reactions += {
case e:MousePressed => selection.on(translate(e))
case e:MouseClicked => selection.on(translate(e))
}
/** Here is my problem :
* > Expression of type (MouseEvent) => MousePressed doesn't conform to expected type Event
*/
def translate(original: MouseEvent): Event = original match {
case pressed:MousePressed =>
pressed.copy(point=relativize(pressed.point))
case clicked:MouseClicked =>
clicked.copy(point=relativize(pressed.point))
case other:MouseEvent=>
other
}
}
我可以通过一个丑陋的演员来绕过这个问题:
case pressed:MousePressed =>
pressed.copy(point=relativize(pressed.point)).asInstanceOf[MousePressed]
但是我还有另一个更奇怪的编译器问题:
错误:(32,21)在MousePressed类中缺少方法副本的参数; 用'_'来跟这个方法如果你想把它当作部分应用的功能
pressed.copy(point = relativize(pressed.point))。asInstanceOf [MousePressed]
在这里,我迷失了,需要你的帮助来完成这个简单的转换。
当然所有方法都使用scala.swing._
类型(并且从不在scala.swing之间混合。 and
java.awt。`)
非常感谢
答案 0 :(得分:1)
关于编译器问题,您可以了解有关查看MouseEvent(特别是MousePressed)文档的抱怨。
案例类使用两个参数列表定义,具有以下简化签名
MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.event.MouseEvent) extends MouseButtonEvent
正如您所看到的,第二个参数列表期待peer
对象,它是底层的Java swing对象。您可以使用相同名称的属性(例如peer
)
pressed.peer
实例
由case类定义生成的copy
方法可能需要第二个参数,如下所示
pressed.copy(point = relativize(pressed.point))(pressed.peer)
如果缺少第二个参数列表,编译器会推断您要部分应用copy
方法,因此它建议您使用
pressed.copy(point = relativize(pressed.point) _
<{3}} curried函数的语法