2011-03-01 18 views
0

我使用 Eclipse來開發在Ubuntu 10.10使用OpenJDK的 Java應用程序後,不聽的Java KeyListener的恢復重點

當使用一個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 

     } 

} 
+0

http://stackoverflow.com/questions/286727/java-keylistener-for-jframe-is-being-unresponsive – MeBigFatGuy 2011-03-01 07:44:13

+0

@mebigfatguy我的問題是關於keylistener在jframe重新獲得焦點後無法工作。 – 2011-03-01 07:59:25

回答

1

我跑進的KeyListener /窗口焦點問題我自己,在Linux操作系統(侏儒)。

我做了一些跟蹤並發現: 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年的一個大學項目。 – 2015-07-16 08:54:38