【问题标题】:KeyListener doesn't detect key pressesKeyListener 不检测按键
【发布时间】: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


【解决方案1】:

当您将特定键的操作(例如: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) 确保当其中一个按钮获得焦点时操作有效。

【讨论】:

  • 按 F2 时没有任何反应?
  • 我把它改成了 s 但你什么也没发生
  • 显然它不喜欢当 s 是一个字符串时。我将其更改为 char 并且可以正常工作。谢谢!
猜你喜欢
  • 2019-09-07
  • 2013-12-16
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
相关资源
最近更新 更多