Java KeyListener никогда не работает (после setFocusable + requestFocusInWindow) - PullRequest
0 голосов
/ 29 сентября 2019

После добавления setFocusable (true) и requestFocusInWindow () мой KeyListener внутри объекта JComponent по-прежнему не работает. Кто-нибудь может найти проблему?

public class Canvas extends JComponent{
    public Canvas(String str) {
        this.str = str;
        this.setPreferredSize(new Dimension(700, 300));
        setFocusable(true);
        requestFocusInWindow();
        addKeyListener(new KeyAdapter(){
            public void keyTyped(KeyEvent e) {
                out.println("in");
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            public void keyPressed(KeyEvent e) {
                out.println("in");
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }

            public void keyReleased(KeyEvent e) {
                out.println("in");
                throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
            }
        });
    }

Я ожидаю, что при нажатии любой клавиши в консоли будет отображаться «in». Спасибо!

1 Ответ

1 голос
/ 29 сентября 2019

После добавления setFocusable (true) и requestFocusInWindow () мой KeyListener внутри объекта JComponent по-прежнему не работает.

Нельзя запрашивать фокус на компоненте, пока компонент не имеетбыл добавлен в кадр был упакован или сделан видимым. Так что запрос фокуса в конструкторе ничего не делает.

Базовая логика должна быть такой:

CustomComponent component = new CustomComponent(...);
frame.add( component );
frame.pack();
frame.setVisible( true );
component.requestFocusInWindow();

Примечание. Я вызвал компонент CustomCompnent, поскольку уже существует класс AWT с именем "Canvas", что может сбивать с толку. Используйте более описательное имя при создании классов.

Другой вариант - переопределить метод addNotify() вашего класса, чтобы вызвать метод requestFocusInWindow().

@Override
public void addNotify()
{
    super.addNotify();
    requestFocusInWindow();
}
...