getFocusOwner с пользовательским классом - PullRequest
4 голосов
/ 11 января 2011

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

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

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

sGrid[40].requestFocusInWindow();

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

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

Ответы [ 3 ]

1 голос
/ 11 января 2011

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

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

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

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

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

1 голос
/ 11 января 2011

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

1 голос
/ 11 января 2011
  1. Вместо пользовательского компонента, разрешающего только цифры, просто используйте JFormattedTextField.
  2. Вам нужно даже определить, какой компонент имеет фокус, почему не добавить KeyListener, MouseListener?Я не совсем уверен, что вы делаете с фокусом, но это кажется странным.
...