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

10-12 05:20