我想检测Scala中的CTRL + S等键盘快捷键。如果只按下一个键,则很容易,但如果按下两个或更多键,则似乎很难。有没有比以下更好的解决方案?
reactions += {
case c @ KeyReleased(_, Key.S, _, _) =>
if (c.peer.isControlDown())
// CTRL+S pressed
}
感觉某种语义不正确,因为它会在S按钮释放后检查是否按下了CTRL按钮(我认为使用KeyPressed
或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")
}
}
}
答案 0 :(得分: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")