java - KeyListener 不检测按键

标签 java swing keylistener

在我的 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/

相关文章:

java - 如何在Java中为Android编程创建 Activity 变量的名称?

java - 在 JApplet 上使用 KeyAdapter 和 Thread 重置/重新启动我的迷你游戏

java - ActionListener 将变量的当前值重置为默认值

java - 在上传的图像文件之上绘图

java - 从 Action 监听器获取答案

java - 尝试启动我的线程

java - 带 Swing 的 keyListener 和带 Swing/keyListener 和 Thread 的游戏关卡系统

java - 从 buildToolsVersion '24.0.2' 切换到更高版本时出现构建错误

java - 通过单击按钮更改 JFrame 颜色

java - jetty HTTP2Client jar 丢失