0

我是一个玩 scala-swing 的 scala 新手。并想在 a 上翻译一个给定scala.swing.Pointscala.swing.event.MousEvent

我想将鼠标事件发送到负责处理形状选择的类。但是因为一个形状有一个相对于他的容器(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 中的方法副本缺少参数;如果您想将其视为部分应用的函数,请使用 `_' 遵循此方法

press.copy(point = relativize(pressed.point)).asInstanceOf[MousePressed]

在这里,我迷路了,需要你的帮助来完成这个简单的转换。

当然,所有方法都使用scala.swing._类型(并且永远不会在 scala.swing.java.awt.` 之间and混合

非常感谢

4

1 回答 1

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

由案例类定义生成的copy方法可能需要第二个参数,像这样

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

由于缺少第二个参数列表,编译器推断您想要部分应用该copy方法,因此它建议您使用

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

部分应用柯里化函数的语法

于 2015-07-20T08:17:31.503 回答