Я использую 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
}
}
Возможный дубликат http://stackoverflow.com/questions/286727/java-keylistener-for-jframe-is-being-unresponsive – MeBigFatGuy
@mebigfatguy мой вопрос о том, как keylistener не работает после восстановления jframe. –