2015-07-20 50 views
0

我是一名玩scala swing的scala新手。并想翻译scala.swing.Pointscala.swing.event.MousEventScala;类型(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中。`)

非常感谢

回答

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对象。您可以使用相同的名称的属性(如pressed.peer

copy方法,通过案例类定义生成,大概预计,第二个参数访问peer情况下,像这样的

pressed.copy(point = relativize(pressed.point))(pressed.peer) 

随着第二参数列表缺失,编译器推断要部分地应用copy方法,因此建议您使用

pressed.copy(point = relativize(pressed.point) _ 

语法为partially applying咖喱功能

+0

非常感谢。而且它消除了投射的需要(我的Ide需要谁来解决这个错误的表达方式) –

相关问题