Получение фокуса на JPanel - PullRequest
       48

Получение фокуса на JPanel

18 голосов
/ 25 января 2010

У меня есть JPanel внутри JFrame. Я зарегистрировал KeyListener, на основании которого я хочу обновить JPanel. Проблема в том, что я не могу сфокусироваться на JPanel, и поэтому мой KeyListener не сработает. Я уже знаю, что KeyListener работает, потому что я зарегистрировал его на JFrame, и он работал нормально. Мой код выглядит примерно так:

myFrame.setFocusable(false);
myPanel.setFocusable(true);
myPanel.addKeyListener(myKL);
myFrame.add(myPanel);

Кто-нибудь сталкивался с такой проблемой раньше? Что-то мне не хватает в этом отношении?

P.S .: У меня нет никаких компонентов внутри JPanel Я просто рисую изображение на фоне, поэтому мне нужно сосредоточиться на самой JPanel, а не на чем-то внутри нее.

Ответы [ 5 ]

21 голосов
/ 25 января 2010

Хотя вы указываете, что панель может быть фокусируемой, панель не запрашивает фокус. Попробуйте использовать myPanel.requestFocus();.

6 голосов
/ 26 января 2010

Используйте setFocusable(true), а затем requestFocusInWindow(). Но последнее должно быть сделано после , когда окно, содержащее панель, становится видимым, для чего вам, вероятно, потребуется зарегистрировать оконный приемник и выполнить requestFocusInWindow() в обработчике, активированном окном. код.

Примечание. В частности, после окна отображается , а не только после вызова setVisible(true).

2 голосов
/ 26 января 2010

Попробуйте

panel.setFocusable(true);
panel.setRequestFocusEnabled(true);

// some code here

panel.grabFocus();
1 голос
/ 04 сентября 2014

Попробуйте что-то вроде этого:

    myFrame.addFocusListener(new FocusAdapter() {

        /**
         * {@inheritDoc}
         */
        @Override
        public void focusGained(FocusEvent aE) {
            myPanel.requestFocusInWindow();
        }
    });
1 голос
/ 26 января 2010

Иногда я сталкиваюсь с подобной проблемой. Я заметил, что в некоторых случаях лучше сделать или запросить фокусировку на конкретном элементе управления внутри панели, которая находится внутри фрейма (например, поле ввода, в которое требуется ввод с клавиатуры), а не запрашивать фокус сама панель.

...