在我的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个按钮,一个尚未设置。这些按钮似乎与键侦听器有某种冲突,因此键侦听器和按钮不起作用。无论哪种方式,鼠标单击侦听器仍然有效。
编辑#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();
}
}
最佳答案
当您将特定键(例如F2)的操作添加到panelA
时,这似乎起作用:
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/