斯卡拉;类型(X)=> X的表达不符合SupX类型

时间:2015-07-20 07:26:07

标签: scala scala-swing

我是一个玩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。`)

非常感谢

1 个答案:

答案 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函数的

语法