我是一名玩scala swing的scala新手。并想翻译scala.swing.Point
scala.swing.event.MousEvent
:Scala;类型(X)=> X的表达式不符合类型SupX
我想将鼠标事件发送给负责处理形状选择的类。但是因为一个形状相对于他的容器有一个位置(表),但是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]
但后来我有另一个更奇怪的编译器的问题:
Error:(32, 21) missing arguments for method copy in class MousePressed; follow this method with `_' if you want to treat it as a partially applied function
pressed.copy(point = relativize(pressed.point)).asInstanceOf[MousePressed]
在这里,我迷路了,并需要你帮忙做这个简单的转换。
当然,所有的方法都使用scala.swing._
类型(和scala.swing之间从不混合。and
java.awt中。`)
非常感谢
非常感谢。而且它消除了投射的需要(我的Ide需要谁来解决这个错误的表达方式) –