我正在使用JavaFX开发音频播放器。我离结尾不远,但我在管理我的密钥快捷方式时遇到了一些困难。
作为一个例子,在主窗口(播放器组件所在的位置),我想影响"右边"在歌曲中前进的关键:
SoundLooper.getInstance().getPrimaryStage().getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
...
} else if (event.getCode() == KeyCode.RIGHT) {
// RIGHT : Move in media +3s
player.moveMediaTime(3000);
event.consume();
...
}
此快捷方式直接分配给窗口,无论聚焦字段如何都处于活动状态。这很有效。
现在,我在此窗口中有一个微调器字段来更改音量(用户可以在此处写入0到100之间的值)。我对它进行了过滤,仅接受数字:
spinnerVolume.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if (!event.getCharacter().matches("[1-9]")) {
event.consume();
}
}
});
我认为这样做,left和rigth键将不再适用于此spinner字段,但它仍然有效。现在,当我输入右键时,有2个动作:
无论聚焦字段如何,我都希望使用rigth键前进,但如果此fied可以使用此键(例如文本字段),则不需要。我怎么能这样做?
另一个例子。当用户键入转义键时,我希望应用程序中的所有对话框都关闭。我有一个对话框,其中只包含一个可编辑的组合框,以及一个&#34; OK&#34;按钮。 我使用相同类型的代码来影响我的对话框的这个键:
stage.getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent e) {
if (e.getCode() == KeyCode.ENTER) {
validate();
} else if (e.getCode() == KeyCode.ESCAPE) {
cancel();
}
}
});
如果组合框文本字段已聚焦,则转义键无效(&#34;句柄&#34;方法未被调用)。如果我&#34;离开&#34;这个字段使用TAB键,然后键入escape,对话框关闭良好。 如果我更换:
else if (e.getCode() == KeyCode.ESCAPE)
通过
else if (e.getCode() == KeyCode.RIGHT)
即使文本字段是聚焦的,弹出窗口也会关闭正确的键入方法...
我确定我错过了什么,有人可以告诉我最好的方法吗?
谢谢,