簡體   English   中英

KeyListener無法檢測到按鍵

[英]KeyListener doesn't detect key presses

在我的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)確保當按鈕之一具有焦點時該動作有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM