【问题标题】:Multiple keybindings on one key?一个键上的多个键绑定?
【发布时间】:2014-12-14 14:30:46
【问题描述】:

我正在使用 JFrame 制作钢琴,但我遇到了一个小问题。 我希望钢琴的琴键在按下时变为绿色,并弹奏一个音符。

b.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('q'), "playD");
b.getActionMap().put("playD", playC);      //playC refers to another Action class       

b.getInputMap(JButton.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('q'), "SetBg");
b.getActionMap().put("SetBg", db);  //db refers to another Action class

但是,这些方法会相互覆盖。 现在,只有颜色发生变化,并且没有播放音符。 如果我删除“SetBg”方法,音符就会播放。

有没有办法解决这个问题?

我遇到的第二个问题是,我似乎无法让它知道何时再次真正释放密钥。 我试过.put(Keystroke.getKeyStroke("released q"), "DoSomething"); 但这似乎没有任何作用。

提前致谢!

【问题讨论】:

  • How to Use Key Bindings键绑定如何工作部分对此进行了解释。 “如果键存在多个绑定,则仅使用找到的第一个有效绑定。”
  • 它还说“由于搜索组件的顺序不可预测,避免重复的 WHEN_IN_FOCUSED_WINDOW 绑定!

标签: java swing key key-bindings keystroke


【解决方案1】:

我不是这方面的专家,但我不认为您可以在同一击键上添加两个键绑定,而第二个绑定会阻止第一个和所有先前的绑定。换句话说,我相信每个特定的击键和输入映射只有一个绑定是可能的。

话虽如此,但我会采取不同的做法:

  • 我将构建我的程序以符合模型-视图-控制 (MVC) 设计模式标准之一。
  • 我希望我的绑定成为控件的一部分,
  • Action 的唯一功能是更改模型的状态,即 something 键已被按下或释放。
  • Model 可以有许多 View 侦听器,它们都可以根据自己认为合适的方式响应模型状态的变化,这里是我对模型变化的两个不同响应的位置。

【讨论】:

  • 谢谢!我做的有点不同,现在可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多