Подтвердить что ты не робот

Получение внимания к JPanel

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Try

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

// some code here

panel.grabFocus();

Ответ 5

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

    myFrame.addFocusListener(new FocusAdapter() {

        /**
         * {@inheritDoc}
         */
        @Override
        public void focusGained(FocusEvent aE) {
            myPanel.requestFocusInWindow();
        }
    });