0

私は scala-swing で遊ぶ scala 初心者です。scala.swing.Pointそして、与えられたを翻訳したいscala.swing.event.MousEvent

図形の選択を処理するクラスにマウス イベントを送信したいと考えています。しかし、シェイプにはコンテナー (シート) に対する相対位置がありますが、MouseEvent.point はウィンドウに対する相対位置であるため、前にそれを変換/相対化する必要があります。

だから、私はsSelectionを受け取るクラスを持っていますMouseEvent:

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 のメソッド copy の引数がありません。部分的に適用された関数として扱いたい場合は、このメソッドの後に `_' を付けます

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

そしてここで、私は道に迷っており、この簡単な変換を行うためにあなたの助けが必要です.

もちろん、すべてのメソッドはscala.swing._型を使用します (そして、scala.swing. andjava.awt. ` の間で混合することはありません) 。

どうもありがとう

4

1 に答える 1

1

コンパイラの問題に関しては、 MouseEvent (特にMousePressed ) のドキュメントを見ると何が不満なのか理解できます。

ケース クラスは、次の簡略化されたシグネチャを持つ 2 つのパラメーター リストで定義されます。

MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.event.MouseEvent) extends MouseButtonEvent 

ご覧のとおり、peerオブジェクトを期待する 2 番目のパラメーター リストがあります。これは、基礎となる Java スイング オブジェクトです。peer同じ名前の属性を使用してインスタンスにアクセスできます(例: pressed.peer)

ケース クラス定義によって生成されたcopyメソッドは、おそらくこの 2 番目のパラメーターを想定しています。

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

copy2 番目のパラメーター リストが欠落しているため、コンパイラーは、メソッドを部分的に適用する必要があると推測しているため、

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

カリー化された関数を部分的に適用するための構文

于 2015-07-20T08:17:31.503 に答える