3

Scala で CTRL+S などのキーボード ショートカットを検出したいと考えています。キーを1つ押すだけなら簡単ですが、キーを2つ以上押すと難しそうです。以下よりも良い解決策はありますか?

reactions += {
  case c @ KeyReleased(_, Key.S, _, _) =>
    if (c.peer.isControlDown())
      // CTRL+S pressed
}

KeyPressedS ボタンが離された後に CTRL ボタンが押されたかどうかをチェックするので、どういうわけか意味的に間違っているように感じます (また、またはを使用する場合はあまり良くないと思いますKeyTyped)。

ここにSSCEがあります:

import scala.swing._
import scala.swing.event._

object SSCCE extends SimpleSwingApplication {
  def top = new MainFrame {
    val textArea = new TextArea(3, 30)
    contents = new FlowPanel {
      contents += textArea
    }
    listenTo(textArea.keys)
    reactions += {
      case c @ KeyReleased(_, Key.S, _, _) =>
        if (c.peer.isControlDown())
          Dialog.showMessage(null, "Message", "CTRL+S pressed")
    }
  }
}
4

1 に答える 1

2

修飾子をテストすることで、パターン マッチ内を確認できます。

case c @ KeyReleased(_, Key.S, mods, _) if (1 == (1 & mods>>7)) =>
  Dialog.showMessage(null, "Message", "CTRL+S pressed")

Ctrl が押されると、インデックス 7 のビットが設定されます。

ただし、元のコードの方が理解しやすいと思います。

もちろん、ヘルパー関数を追加すると役立ちます。

def ctrlDown(mods:Int) = (1 == (1 & mods>>7))
...

case c @ KeyReleased(_, Key.S, mods, _) if ctrlDown(mods) =>
  Dialog.showMessage(null, "Message", "CTRL+S pressed")
于 2014-04-16T11:24:12.087 に答える