【问题标题】:Java KeyListener does not listen after regaining focusJava KeyListener 在重新获得焦点后不监听
【发布时间】:2011-07-06 06:38:44
【问题描述】:

我正在使用 Eclipse 使用 OpenJDK 开发 Java 应用程序 在 Ubuntu 10.10 上

当使用带有 Jframe 的 keylistner 时,Keylistner 工作完美,直到框架获得焦点,但如果将焦点切换到另一个应用程序然后将焦点返回到 Jframe,它不会开始监听按键。 我需要做的是,当框架重新获得焦点时,keylistener 应该再次开始工作。我的应用程序中只有一帧。

我已经实现了一个 KeyListner,将它添加到一个 JFrame:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import code.NewJFrame;
public class Gamepad implements KeyListener

{

    boolean button_up;
    boolean button_down;
    boolean button_right;
    boolean button_left;

    boolean b1;
    boolean b2;
    boolean b3;
    boolean b4;

    boolean select;
    boolean start;
    boolean r1;
    boolean r2;

    boolean l1;
boolean l2;

boolean joyl_up;
boolean joyl_down;
boolean joyl_right;
boolean joyl_left;

boolean joyr_up;
boolean joyr_down;
boolean joyr_right;
boolean joyr_left;



    final static char BUTTON_UP ='Q' ;
    final static char BUTTON_DOWN='W';
    final static char BUTTON_RIGHT='E';
    final static char BUTTON_LEFT='R';

    final static char B1='T';
    final static char B2='Y';
    final static char B3='U';
    final static char B4='I';

    final static char SELECT='O';
    final static char START='P';

    final static char R1='A';
    final static char R2='S';

    final static char L1= 'D';
    final static char L2= 'F';

    final static char JOYL_UP='G';
    final static char JOYL_DOWN='H';
    final static char JOYL_RIGHT='J';
    final static char JOYL_LEFT='K';

    final static char JOYR_UP='L';
    final static char JOYR_DOWN='Z';
    final static char JOYR_RIGHT='X';
    final static char JOYR_LEFT='C';


public Gamepad()
    {
        button_up = false;
        button_down= false;
        button_right= false;
        button_left= false;

        b1= false;
        b2= false;
        b3= false;
        b4= false;

        select= false;
        start= false;
        r1= false;
        r2= false;

        l1= false;
        l2= false;
    }

    /**
     * @param args
     */
    public static void main(String[] args)
        {
         NewJFrame nj = new NewJFrame();
         Gamepad gp = new Gamepad();
         nj.addKeyListener(gp);
         nj.setVisible(true);

        }



    @Override
    public void keyPressed(KeyEvent e)
        {
            char c= Character.toUpperCase( e.getKeyChar() );

             System.out.println("PRESSED:\t"+c);
             if(c==BUTTON_UP) button_up=true;
             else if(c==BUTTON_DOWN)                    button_down=true;
             else if(c==BUTTON_RIGHT)                button_right=true;
             else if(c==BUTTON_LEFT)                     button_left=true;
             else if(c==B1)                                                      b1=true;
             else if(c==B2)                                                      b2=true;
             else if(c==B3)                                                     b3=true;
             else if(c==B4)                                                      b4=true;
             else if(c==SELECT)                                     select=true;
             else if(c==START)                                      {   start=!start; Global.playToggle();}
             else if(c==R1)                                                     r1=true;
             else if(c==R2)                                                     r2=true;
             else if(c==L1)                                                     l1=true;
             else if(c==L2)                                                      l2 =true;
             else if(c==JOYL_DOWN)                              joyl_down   =true;
             else if(c==JOYL_LEFT)                              joyl_left   =true;
             else if(c==JOYL_RIGHT)                         joyl_right  =true;
             else if(c==JOYL_UP)                                        joyl_up =true;
             else if(c==JOYR_DOWN)                              joyr_down   =true;
             else if(c==JOYR_LEFT)                              joyr_left   =true;
             else if(c==JOYR_RIGHT)                         joyr_right  =true;
             else if(c==JOYR_UP)                                        joyr_up =true;


        }



    @Override
    public void keyReleased(KeyEvent e)
        {
            char c= Character.toUpperCase( e.getKeyChar() );


         System.out.println("RELEASED:\t"+e.getKeyChar());

         if(c==BUTTON_UP) button_up=true;
         else if(c==BUTTON_DOWN)                    button_down=false;
         else if(c==BUTTON_RIGHT)                button_right=false;
         else if(c==BUTTON_LEFT)                     button_left=false;
         else if(c==B1)                                                      b1=false;
         else if(c==B2)                                                      b2=false;
         else if(c==B3)                                                     b3=false;
         else if(c==B4)                                                      b4=false;
         else if(c==SELECT)                                     select=false;
         else if(c==START)                                          ;//{start=false; Global.playToggle();}
         else if(c==R1)                                                     r1=false;
         else if(c==R2)                                                     r2=false;
         else if(c==L1)                                                     l1=false;
         else if(c==L2)                                                      l2 =false;
         else if(c==JOYL_DOWN)                              joyl_down   =false;
         else if(c==JOYL_LEFT)                              joyl_left   =false;
         else if(c==JOYL_RIGHT)                         joyl_right  =false;
         else if(c==JOYL_UP)                                        joyl_up =false;
         else if(c==JOYR_DOWN)                              joyr_down   =false;
         else if(c==JOYR_LEFT)                              joyr_left   =false;
         else if(c==JOYR_RIGHT)                         joyr_right  =false;
         else if(c==JOYR_UP)                                        joyr_up =false;

        }



    @Override
    public void keyTyped(KeyEvent e)
        {
            // TODO Auto-generated method stub

        }

}

【问题讨论】:

标签: java linux eclipse keyboard


【解决方案1】:

我自己在 Linux (gnome) 中遇到了 keylistener/window focus 问题。

我做了一些追踪发现: 1)当您单击窗口外时,不会触发 LOST FOCUS(不触发焦点事件)。 2) 重新获得焦点/点击窗口,导致它触发 LOST FOCUS 事件,而不是获得焦点。

现在似乎对我有用的修复:

        frame.addFocusListener(new FocusListener(){
            public void focusGained(FocusEvent e){
                System.out.println("Focus GAINED:"+e);
            }
            public void focusLost(FocusEvent e){
                System.out.println("Focus LOST:"+e);

                // FIX FOR GNOME/XWIN FOCUS BUG
                e.getComponent().requestFocus();
            }
        });

基本上在失去焦点时请求焦点。对于 Windows 用户来说似乎也没有什么问题,当你失去焦点时,图标可能会在你的开始栏上闪烁,更糟糕的是。

另外,如果你想像我一样进行调试,代码如下:

        Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener(){
            public void eventDispatched(AWTEvent e) {
                    System.out.println("AWT:"+e);
                    System.out.flush();
            }
        }, FocusEvent.FOCUS_EVENT_MASK | WindowEvent.WINDOW_FOCUS_EVENT_MASK | WindowEvent.WINDOW_EVENT_MASK);

希望这对某人有所帮助!

【讨论】:

  • 谢谢。抱歉,由于我不再从事此项目,因此我无法对此进行测试或将其标记为已接受。这是 2011 年的一个大学项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多