почему нажатая клавиша не вызывает какого-либо события? - PullRequest
0 голосов
/ 10 декабря 2011

Ниже приведена программа, которая отображает черный экран с сообщением 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 ]

4 голосов
/ 10 декабря 2011

Может быть, вам нужно окно, но у вас есть две проблемы:

  1. Вы должны расширять JWindow, а не Window при использовании приложения Swing
  2. Даже расширение JWindow не будет работать, потому чтоJWindow не получит KeyEvent, если его родительский JFrame не виден.

Так что вы должны использовать JFrame.Если вам не нужны строка заголовка и границы, тогда вы можете использовать недокрашенный JFrame.

Кроме того, вам НЕ следует использовать KeyListener, потому что даже на событиях клавиш JFrame события отправляются только в сфокусированный компонент.Вместо этого вы должны использовать Key Bindings .В этом случае кажется, что вы должны добавить привязку к корневой панели фрейма.

1 голос
/ 10 декабря 2011

Расширьте JFrame и избавьтесь от супер-вызова.

...