所以我正在使用Java中的 Piano like-program 。我使用一个看起来像这样的方法来触发每个键的正确声音
public void Sound(String file){
try{
AudioInputStream ais = AudioSystem.getAudioInputStream(getClass().getResource(file));
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(getClass().getResource(file)));
clip.start();
}catch(Exception e){
e.printStackTrace();
}
game.setFocusable(true);//my desperate try to regain focus on click...
game.requestFocus();
}
然而,经过一段时间后,KeyListener
总计失去焦点,KeyEvent
将不再被触发。如果有人知道我如何能够专注于框架中的KeyListener
,那么我会更多地听到你要说的话。
我尝试过:
触发时将面板设置为可再次聚焦
确保程序仍然在后台运行,实际上面板失去了重点。
小其他调整
答案 0 :(得分:5)
之前已多次询问此问题,在这种情况下,最佳解决方案是不使用KeyListener 。而是使用pair
(点击链接),这在组件焦点方面表现得更好。
侧面推荐:务必播放Swing事件线程的音乐 off ,以免占用此线程并冻结GUI,并且所有Swing调用都会 on < / strong> Swing事件线程。
答案 1 :(得分:0)
您可以强制焦点添加具有高优先级队列的事件。 我在扫描条形码的应用程序中使用了它,并且它们在发送关键事件方面具有非常高的速度,并且我需要使用它来失去焦点并获得其他领域的关注。
您可以执行以下操作,替换:
game.setFocusable(true);//my desperate try to regain focus on click...
game.requestFocus();
与
SunToolkit.flushPendingEvents();
FocusEvent fl = new CausedFocusEvent(game, FocusEvent.FOCUS_GAINED, false, null,
CausedFocusEvent.Cause.TRAVERSAL);
SunToolkit.postPriorityEvent(fl);
通过这种方式,我可以保证您会立即关注游戏组件
最好的问候!