2

次のような「反応」ブロックがあるとします。

this.reactions += {
  case KeyReleased(src, key, mod, _) => {
  // do some stuff
  // but how to consume this KeyEvent??
  }
}

「何か」をやめた後、KeyEventを使いたいのですが、方法がわかりません。Component.scalaのソースを調べると、KeyReleasedイベントがどのように構築されているかがわかりました。

object keys extends Publisher {
  peer.addKeyListener(new KeyListener {
    def keyPressed(e: java.awt.event.KeyEvent) { publish(new KeyPressed(e)) }
    def keyReleased(e: java.awt.event.KeyEvent) { publish(new KeyReleased(e)) }
    def keyTyped(e: java.awt.event.KeyEvent) { publish(new KeyTyped(e)) }
  })
}

java.awt.event.KeyEventはコンストラクター・パラメーターとして使用されますが、KeyReleasedケース・クラスにはこのシグニチャーがあります

case class KeyReleased(val source: Component, key: Key.Value, val modifiers: Key.Modifiers, 
                location: Key.Location.Value)
               (val peer: java.awt.event.KeyEvent) extends KeyEvent {
def this(e: java.awt.event.KeyEvent) = 
this(UIElement.cachedWrapper[Component](e.getSource.asInstanceOf[JComponent]), 
    Key(e.getKeyCode), e.getModifiersEx, Key.Location(e.getKeyLocation))(e) 
}

したがって、KeyEventパラメーターにアクセスできません。

4

1 に答える 1

4

caseステートメントのリアクションでKeyReleasedイベントを解凍する必要はありません。イベント自体を照合するだけで、consumを呼び出すことができます。

reactions += {
    case e: KeyReleased => {
        println(e.source, e.key, e.modifiers)
        e.consume
    }
}
于 2012-08-02T12:23:05.173 に答える