getFocusOwner с персонализиран клас

Имам нужда от помощ при работа с 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. Има ли нещо, което правя грешно? Благодаря предварително за всяка помощ.


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