getFocusOwner с пользовательским классом

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

Хорошо, поэтому в целях тестирования я пытаюсь установить фокус на SetField, пользовательский класс, расширяющий JTextField (Пользовательский, потому что я хотел отключить любые входные данные, которые не были числами). Он был настроен на фокусировку. Я вызвал requestFocusInWindow() для SetField в середине сетки, и фокус был установлен на этот компонент. Проблема возникает, когда я пытаюсь получить компонент, который имеет фокус.

Вот что я делаю, чтобы протестировать метод getFocusOwner():

sGrid[40].requestFocusInWindow();

    try{
        System.out.println(this.getFocusOwner().getClass().getSimpleName());
    } catch(NullPointerException e){
        e.printStackTrace();
    }

Независимо от того, на каком компоненте я пытаюсь это сделать, я всегда получаю исключение нулевого указателя. Я пробовал это с JButtons, JLabels и даже с JPanels в своей программе. Однако фокус установлен на компоненте. Я вижу мигание каретки в предполагаемом SetField. Я что-то делаю не так? Заранее благодарю за любую помощь.


person SkylineAddict    schedule 11.01.2011    source источник


Ответы (3)


  1. Вместо пользовательского компонента, разрешающего только числа, просто используйте JFormattedTextField.
  2. Вам нужно даже определить, какой компонент имеет фокус, почему бы не добавить KeyListener, MouseListener? Я не совсем уверен, что вы делаете с фокусом, но это кажется странным.
person jzd    schedule 11.01.2011
comment
Все, что я делаю, — это тестирую метод getFocusOwner, распечатывая простое имя компонента, который он возвращает. Я решил, что мне нужно будет получить, какой компонент имеет фокус, чтобы я мог выяснить, куда перейдет фокус после нажатия клавиши со стрелкой. Я рассмотрю JFormattedTextField. Мое текущее решение все равно не работает слишком хорошо. - person SkylineAddict; 11.01.2011

Я хочу добавить в программу навигацию по клавишам со стрелками.

Вы должны использовать привязки клавиш. Создайте базовое «ChangeFocusAction». Вам понадобится 4 экземпляра этого класса, которые вы можете сопоставить с KeyStroke.

Предполагая, что у вас есть массив из 81 текстового поля, ваше действие может быть создано с целочисленным значением, которое сообщает действию, как изменить фокус. Например:

вправо = -1
влево = 1
вверх = -9
вниз = 9

Источник ActionEvent будет содержать текстовое поле, которое имеет фокус. Затем вы ищете массив, чтобы найти смещение этого текстового поля. Затем вы добавляете значение int сверху в индекс и запрашиваете фокус на этом компоненте.

person camickr    schedule 11.01.2011
comment
Это именно то, что я думал сделать, но мне нужно сначала получить компонент, который имеет фокус, верно? - person SkylineAddict; 11.01.2011
comment
Это то, что я сказал. ActionEvent имеет исходный компонент. - person camickr; 11.01.2011

Только что узнал проблему. Для всех, у кого есть проблемы с этим, попробуйте использовать (Window).getMostRecentFocusOwner(). Это сработало для меня.

person SkylineAddict    schedule 11.01.2011