Имам JFrame с Canvas в него (кощунство, знам). Canvas има прикачени MouseListener и KeyListener и е поискал фокус с:
canvas.setFocusable(true);
canvas.requestFocusInWindow();
Когато го стартирам за първи път, всичко се държи според очакванията, като събитията летят навсякъде. След няколко секунди той спира да отговаря на нормално въвеждане на клавиш (keyPressed и keyTyped не се задействат). Странно, държането на детелина (аз съм на OSX) кара всичко да работи нормално.
Какво става? Защо се случва това и какво мога да направя, за да го поправя?
Редактиране: Разбрах какво поведение задейства грешката. Започва да се случва само когато задържите клавиш. Когато го пуснете, събитията keyPressed спират да се задействат. По-долу е моят MCVE.
import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.image.BufferStrategy;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
public class Listener implements MouseListener,KeyListener {
JFrame frame;
Canvas screen;
public Listener() {
// initialize the screen canvas
screen = new Canvas();
Dimension size = new Dimension(640, 480);
screen.setMinimumSize(size);
screen.setMaximumSize(size);
screen.setPreferredSize(size);
screen.addMouseListener(this);
screen.addKeyListener(this);
screen.setFocusable(true);
// initialize the frame
frame = new JFrame("Parasite");
frame.add(screen);
frame.pack();
frame.setVisible(true);
screen.requestFocusInWindow();
// create buffer strategy (after showing frame)
screen.createBufferStrategy(2);
}
public static void main(String[] args) {
Listener listener = new Listener();
}
public void mouseClicked(MouseEvent e) {
System.out.println("click");
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void keyTyped(KeyEvent e) {
System.out.println("t " + e.getKeyChar());
}
public void keyPressed(KeyEvent e) {
System.out.println("p " + e.getKeyChar());
}
public void keyReleased(KeyEvent e) {
System.out.println("r " + e.getKeyChar());
}
}
MouseListener
към платното и да извикватеrequestFocusInWindow
всеки път, когато се щракне върху него - person MadProgrammer   schedule 25.11.2014