我是一个玩 scala-swing 的 scala 新手。并想在 a 上翻译一个给定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 中的方法副本缺少参数;如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法
press.copy(point = relativize(pressed.point)).asInstanceOf[MousePressed]
在这里,我迷路了,需要你的帮助来完成这个简单的转换。
当然,所有方法都使用scala.swing._
类型(并且永远不会在 scala.swing.java.awt.` 之间and
混合)
非常感谢