为什么按下键不会触发任何事件?

时间:2011-12-10 02:56:21

标签: java swing event-handling window actionlistener

以下是一个显示黑屏的程序 ALARM!

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class displayFullScreen extends Window {
    private JLabel alarmMessage = new JLabel("Alarm !");

    public displayFullScreen() {
        super(new JFrame());
        setLayout(new FlowLayout(FlowLayout.CENTER));
        alarmMessage.setFont(new Font("Cambria",Font.BOLD,100));
        alarmMessage.setForeground(Color.CYAN);
        add(alarmMessage);
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(0,0,screenSize.width,screenSize.height);
        setBackground(Color.black);

        addKeyListener(new KeyAdapter() {
           @Override
           public void keyPressed(KeyEvent ke) {
                escapeHandler(ke);
           } 
        });
    }

    public void escapeHandler(KeyEvent ke) {
        if(ke.getKeyCode() == ke.VK_ESCAPE) {
            System.out.println("escaped !");
        } else {
            System.out.println("Not escaped !");
        }
    }

    public static void main(String args[]) {
        new displayFullScreen().setVisible(true);
    }
}

我在这个程序中设置了一个密钥处理程序。当焦点在窗口上时,处理程序捕获按下的键。 当按下退出键时,应显示escaped ! !escaped。 但是当我按下一个键时,什么都没有显示出来。问题是什么 ?

2 个答案:

答案 0 :(得分:4)

也许你想要一个窗口但是你有两个问题:

  1. 您应该在使用Swing应用程序时扩展JWindow,而不是Window
  2. 即使扩展JWindow也行不通,因为除非父JFrame可见,否则JWindow不会收到KeyEvent。
  3. 所以你应该使用JFrame。如果您不想要标题栏和边框,则可以使用未修饰的JFrame。

    此外,您不应该使用KeyListener,因为即使在JFrame键上,事件也只会被调度到焦点组件。相反,您应该使用Key Bindings。在这种情况下,您似乎应该将绑定添加到框架的根窗格。

答案 1 :(得分:1)

改为扩展JFrame并摆脱超级调用。

相关问题