Java KeyListener не слушает после восстановления фокуса - PullRequest
0 голосов
/ 01 марта 2011

я использую Eclipse для разработки Java-приложения с использованием OpenJDK на Ubuntu 10.10

При использовании списка ключей с Jframe Keylistner работает идеально, пока фрейм не имеет фокуса, но если переключить фокус на другое приложение, а затем вернуть фокус обратно на Jframe, он не начинает слушать нажатия клавиш на этот раз. Что мне нужно сделать, так это то, что кейлист снова должен начать работать, когда рамка вновь обретет фокус. в моем приложении только один кадр.

Я реализовал 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

        }

}

1 Ответ

1 голос
/ 25 января 2014

Я столкнулся с проблемами фокусировщика окон / окон в Linux (gnome).

Я провел некоторую трассировку и обнаружил: 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);

Надеюсь, это кому-нибудь поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...