在我的 JFrame 中,我有这个监听器:
this.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent arg0) {
//do stuff
}
});
直到大约 10 分钟前,该功能一直运行良好。现在,当我按下一个键时, keyPressed() 甚至永远不会被调用。我用 eclipse 调试器对此进行了测试。
我不知道发生了什么。有什么想法吗?
编辑#1:我设置的按钮也会发生这种情况。操作监听器无法识别何时单击按钮。
编辑#2:好的,所以我能够缩小范围。我有一个 JFrame,这个框架有一个主面板和 2 个 Action 监听器(keyListener,有问题的监听器,和一个鼠标单击监听器,工作正常)。主面板有两个子面板 a 和 b。 a 面板有 2 个按钮,其中一个尚未设置。似乎这些按钮在某种程度上与按键监听器发生冲突,因此按键监听器和按钮不起作用。无论哪种方式,鼠标单击监听器仍然有效。
编辑 #3:好的,这是一些简化的代码:
按钮可以工作,但 keyListener 不能。我经常听说焦点问题,如果这是问题,我该如何解决它?
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ListenerTest extends JFrame {
private JPanel mainPanel;
private JPanel panelA;
private JPanel panelB;
private JButton buttonA;
private JButton buttonB;
public ListenerTest() {
mainPanel = new JPanel();
panelA = new JPanel();
panelB = new JPanel();
buttonA = new JButton("Button A");
buttonB = new JButton("Button B");
this.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent arg0) {
System.out.println(arg0.getKeyChar());
}
});
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
System.out.println(e.getX() + ", " + e.getY());
}
});
buttonA.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Button A pressed!");
}
});
panelA.add(buttonA);
panelA.add(buttonB);
mainPanel.add(panelA);
mainPanel.add(panelB);
this.add(mainPanel);
this.setSize(300, 300);
this.setVisible(true);
}
public static void main(String args[]) {
new ListenerTest();
}
}
最佳答案
当您向 panelA
添加特定键(例如:F2)的操作时,这似乎有效:
public ListenerTest() {
// Create components...
panelA.getActionMap().put("saveAction", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("F2");
}
});
//panelA.getInputMap().put(KeyStroke.getKeyStroke("F2"), "saveAction");
panelA.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
.put(KeyStroke.getKeyStroke("F2"), "saveAction");
//this.addKeyListener(new KeyAdapter() {
//mainPanel.addKeyListener(new KeyAdapter() {
panelA.addKeyListener(new KeyAdapter() {
//buttonA.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent arg0) {
System.out.println("Panel A: " + arg0.getKeyChar());
}
});
// Rest of the code...
}
添加操作似乎也会产生副作用:KeyListener
似乎再次对 panelA
起作用。默认情况下,焦点不再转到其中一个按钮。
注意:使用panelA.getInputMap()
时,按键操作仅在按钮没有焦点时起作用。使用 panelA.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
确保当其中一个按钮获得焦点时该操作有效。
关于java - KeyListener 不检测按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962830/