Java获得焦点

时间:2017-03-19 15:05:27

标签: java swing jpanel keylistener

所以我正在使用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,那么我会更多地听到你要说的话。

我尝试过:

  1. 触发时将面板设置为可再次聚焦

  2. 确保程序仍然在后台运行,实际上面板失去了重点。

  3. 小其他调整

2 个答案:

答案 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);

通过这种方式,我可以保证您会立即关注游戏组件

最好的问候!