[英]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.