Проблема возникает при навешивании KeyListenera на JFrame - приложение почему-то начинает считывать данные с клавиатуры.
Дано:
1) окно JFrame
Код |
import java.awt.Canvas; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.HeadlessException; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.KeyListener; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.WindowListener; import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
public class Window extends JFrame {
private static final long serialVersionUID = -6079457947651675591L; public BufferStrategy bufferStrategy; public Graphics g; public int W; public int H;
public Window(int H, int W, String title, WindowListener WL, KeyListener KL, MouseMotionListener MML, MouseListener ML) { super(); {
setIgnoreRepaint(true); // setMinimumSize(new Dimension(W, H)); // setMaximumSize(new Dimension(W, H)); this.W = W; this.H = H; setResizable(false); setTitle(title);
JFrame.setDefaultLookAndFeelDecorated(true);
// 2. Optional: What happens when the frame closes? canvas = new Canvas(); canvas.setIgnoreRepaint(true); canvas.setSize(W, H); canvas.setBackground(Color.GRAY); add(canvas);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addWindowListener(WL); addKeyListener(KL); canvas.addMouseListener(ML); // addMouseListener(ML); canvas.addMouseMotionListener(MML); // // 3. Create components and put them in the frame. // ...create emptyLabel... // frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); getContentPane();
// Add canvas to game window...
Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize(); int h = screenSize.height; int w = screenSize.width; // this.setBackground(Color.WHITE);
pack();
setVisible(true); setLocation((w - this.getWidth()) / 2, (h - this.getHeight()) / 2); // System.out.println(this.getWidth());
canvas.createBufferStrategy(2); bufferStrategy = canvas.getBufferStrategy(); } System.gc(); // createBufferStrategy(2); // bufferStrategy = getBufferStrategy(); }
final Canvas canvas;
public final static void close(Window w) { // TODO Auto-generated method stub w.setVisible(false); w.dispose(); System.gc();
}
}
|
2) KeyListener
Код |
import java.awt.event.KeyEvent; import java.awt.event.KeyListener;
public class KeyBoard implements KeyListener {
@Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub System.out.println("t:" + e);
}
@Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub System.out.println("p:" + e);
}
@Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub System.out.println("r:" + e);
}
}
|
Запускаю:
Код |
public static void main(String[] args) { // TODO Auto-generated method stub KeyBoard k = new KeyBoard(); Window w = new Window(480, 640, "test", null, k, null, null);
}
|
Что ожидал увидеть в консоли:
Код | p:java.awt.event.KeyEvent[KEY_PRESSED,keyCode=70,keyText=F,keyChar='f',keyLocation=KEY_LOCATION_STANDARD,rawCode=70,primaryLevelUnicode=102,scancode=33] on frame0 t:java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='f',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0 r:java.awt.event.KeyEvent[KEY_RELEASED,keyCode=70,keyText=F,keyChar='f',keyLocation=KEY_LOCATION_STANDARD,rawCode=70,primaryLevelUnicode=102,scancode=33] on frame0 p:java.awt.event.KeyEvent[KEY_PRESSED,keyCode=68,keyText=D,keyChar='d',keyLocation=KEY_LOCATION_STANDARD,rawCode=68,primaryLevelUnicode=100,scancode=32] on frame0 t:java.awt.event.KeyEvent[KEY_TYPED,keyCode=0,keyText=Unknown keyCode: 0x0,keyChar='d',keyLocation=KEY_LOCATION_UNKNOWN,rawCode=0,primaryLevelUnicode=0,scancode=0] on frame0 ...
|
Но иногда вместо этого запускается считывани с консоли:

Вопрос: это баг или Я не прав? Что Я делаю не так?
спасибо.
|