2011-03-01 2 views
0

Я использую Eclipse, для разработки приложения Java с помощью OpenJDK на Ubuntu 10.10Java KeyListener не слушает после восстановления фокуса

При использовании keylistner с JFrame, то 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 

     } 

} 
+0

Возможный дубликат http://stackoverflow.com/questions/286727/java-keylistener-for-jframe-is-being-unresponsive – MeBigFatGuy

+0

@mebigfatguy мой вопрос о том, как keylistener не работает после восстановления jframe. –

ответ

1

Я побежал в KeyListener/оконном фокус вопросы сам, в 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); 

Надеется, что это помогает кто-то!

+0

Спасибо. Извините, я не могу проверить это или отметить его как принятый, так как я больше не работаю над этим проектом. Это был проект колледжа в 2011 году. –