【发布时间】:2015-07-20 07:26:07
【问题描述】:
我是一个玩 scala-swing 的 scala 新手。并想在scala.swing.event.MousEvent 上翻译给定的scala.swing.Point:
我想将鼠标事件发送到负责处理形状选择的类。但是因为一个形状有一个相对于他的容器的位置(sheet)但是 MouseEvent.point 是相对于窗口的,我应该在之前翻译/相对化它。
所以,我有一个Selection 类接收MouseEvents:
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 之间混合。andjava.awt.`)
非常感谢
【问题讨论】:
标签: scala scala-swing