java程序监听不到KeyListener,无法触发

本文探讨了Swing中如何正确地为面板或框架添加键盘事件监听器,并确保焦点能够到达,以便响应如回车键等操作。通过实例代码演示了如何设置监听器并使其生效。




首先,监听键盘相应的控件必须是获得焦点(focus)的情况下才能起作用.
其次,如果你要实现的效果是焦点在任何其他控件上时(比如其他button)回车也能起作用,那么,这个动作的监听控件就不应该是你的登陆button,因为此时你的焦点在其他地方,你的登陆button并没有焦点,所以无法获得响应.要在这种情况下使回车键响应,必须将你的监听控件设置在你的panel或fram或更底层的级别上,这样只要焦点在此控件中任何一个button上,监听动作才能响应, 比如:
Panel p = new Panel();
JButton b1 = new JButton();
JButton b2 = new JButton();
p.add(b1);
p.add(b2);
p.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e){......} });
p.setFocusable(true);//给p提供焦点.
追问
您好,我看了一下你的代码,你可否告诉我为什么不加上setFocusable(true);这句,就不能触发事件呢?
回答
这是swing的焦点问题,JFrame 、JComponent、JLabel默认是不可以获得焦点,而且默认情况下,swing是把焦点分配给容器内可以获得焦点的第一个组件

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class FrameEvent extends JFrame implements KeyListener {
    JTextArea textarea = new JTextArea(1030);
    private JLabel status;
 
    public FrameEvent() {
        super("KeyinEvent.java: ");
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        setFocusable(true);
        textarea.setText("请按任意键:");
        c.add(textarea);
        addKeyListener(this);
        setSize(350300);
        show();
        this.setDefaultCloseOperation(3);
    }
 
    public void keyPressed(KeyEvent e) {
        // String line1="按键:"+e.getKeyChar()+"\n";
        // String line2="a按键是否为Action键:"+e.isActionKey();
        // @SuppressWarnings("static-access")
        // String mKey=e.getKeyModifiersText(e.getModifiers());
        // String line3="是否按下Modifier键"+(mKey.equals("")?"否":"是,其键为"+mKey);
        // textarea.setText(line1+"\n"+line2+"\n"+line3+"\n");
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            System.out.println("123");
        }
        // char ch = e.getKeyChar();
        // status.setText(String.valueOf(ch) + "   " +(int)ch);
 
    }
 
    public void keyReleased(KeyEvent e) {
    }
 
    public void keyTyped(KeyEvent e) {
    }
 
    public static void main(String args[]) {
        FrameEvent app = new FrameEvent();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值