Ответ 1
Хотя вы указываете, что панель может быть сфокусирована, панель не запрашивает фокус. Попробуйте использовать myPanel.requestFocus();
.
У меня есть 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, а не на чем-то внутри него.
Хотя вы указываете, что панель может быть сфокусирована, панель не запрашивает фокус. Попробуйте использовать myPanel.requestFocus();
.
Используйте setFocusable(true)
, а затем requestFocusInWindow()
. Но последнее должно быть сделано после, окно, содержащее панель, становится видимым, для чего вам, вероятно, потребуется зарегистрировать прослушиватель окна и сделать requestFocusInWindow()
в окне активированного кода обработчика.
Примечание. В частности, после появления окна , а не только после вызова setVisible(true)
.
Иногда я сталкиваюсь с аналогичной проблемой. Я заметил, что в некоторых случаях лучше сделать или запросить фокус на конкретном элементе управления внутри панели, которая находится внутри фрейма (например, поле ввода, в которое вы хотите вводить ввод с клавиатуры), а не запрашивать фокус для сама панель.
Try
panel.setFocusable(true);
panel.setRequestFocusEnabled(true);
// some code here
panel.grabFocus();
Попробуйте что-то вроде этого:
myFrame.addFocusListener(new FocusAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void focusGained(FocusEvent aE) {
myPanel.requestFocusInWindow();
}
});