【发布时间】:2015-07-09 20:47:21
【问题描述】:
在我的 JFrame 中,我有这个监听器:
this.addKeyListener(new KeyAdapter(){
@Override
public void keyPressed(KeyEvent arg0) {
//do stuff
}
});
直到大约 10 分钟前,它一直运行良好。现在,当我按下一个键时, keyPressed() 甚至都不会被调用。我用 Eclipse 调试器对此进行了测试。
我不知道发生了什么。有什么想法吗?
编辑#1:这也发生在我设置的按钮上。单击按钮时,动作侦听器无法识别。
编辑#2:好的,所以我能够缩小范围。我有一个 JFrame,这个框架有一个主面板和 2 个动作监听器(keyListener,有问题的监听器和一个鼠标点击监听器,工作正常)。主面板有两个子面板 a 和 b。面板 a 有 2 个按钮,其中一个尚未设置。似乎这些按钮在某种程度上与 keylistener 发生冲突,因此 key listener 和按钮不起作用。无论哪种方式,鼠标点击监听器仍然有效。
编辑#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();
}
}
【问题讨论】:
-
在这关键的 10 分钟内你做了哪些改变?在哪里改变?
-
我尝试撤消尽可能多的更改,但没有任何效果。我只是不明白为什么这个方法从来没有被调用过。
-
尝试常规:清理构建,重新编译,重新启动 IDE,重新启动电脑。它不应该有任何区别,但在我的经验中它确实......
-
尝试创建一个MCVE。在创建一个工作的最小示例时,您可能只是遇到导致问题的代码片段并自己理解它。如果没有,您将有代码向我们展示我们可以自己运行并为您提供更好的帮助。
-
对于 Swing,我们通常使用key bindings 而不是较低级别的
KeyListener。
标签: java swing keylistener