AWT Canvas не может получить фокус в присутствии другого фокусируемого компонента - PullRequest
2 голосов
/ 31 мая 2011

У меня есть простой графический интерфейс с JTextField и AWT Canvas (чтобы избежать встречного вопроса о том, почему я использую AWT Canvas: мне нужно иметь дескриптор окна).

Canvasдля обработки входных событий, это означает, что он должен быть фокусируемым.Я заверяю это, используя setFocusable(true) в своем конструкторе, более поздние проверки с использованием isFocusable() подтверждают, что он действительно фокусируемый.

Теперь JTextField получает фокус по умолчанию при открытии GUI.Пока это нормально для меня.Однако нет никакого способа получить фокус от от этого JTextField.

В статье "Подсистема фокусировки AWT" четко говорится, что если фокусируемый компонент находится в процессенажал на, он получит фокус.Этого не происходит, фактически я получаю события с нулевым изменением фокуса, только если окно снова деактивируется и активируется, но затем фокус возвращается обратно к JTextField.

Явные вызовы requestFocus() иrequestFocusInWindow() тоже не помогают, последний всегда возвращает false.

Я получил те же результаты с любым фокусируемым компонентом, если я заменил JTextField.Если Canvas - единственный фокусируемый контейнер, все работает нормально, потому что он всегда будет в фокусе.

Я что-то здесь упускаю?Можно ли как-нибудь сделать фокусировку моего Canvas в присутствии другого фокусируемого компонента, желательно, чтобы этот фокус не фокусировался?

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Извините, что оставил некоторую информацию, которая оказалась корнем проблемы.

Как уже упоминалось, я использую тяжелый компонент, поэтому у меня есть дескриптор окна.Он мне нужен, потому что он передается приложению OpenGL в нативной библиотеке, затем холст AWT используется как холст для рендеринга.

В Windows Java использует поле окна GWLP_USERDATA для хранения указателя на объект AWTComponent,Однако указанное приложение OpenGL переопределяет это поле для хранения своего собственного указателя объекта Window, что, конечно, нарушит все функции, связанные с AWT.

Я решил эту проблему, создав специальный обработчик сообщений окна, который делегирует входящие сообщения обоимПриложение OpenGL и часть AWT для Java.

1 голос
/ 31 мая 2011

в основном в фокусе свинга получил 1-й.Слева (ToRight) JComponents вверху

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

но у меня работает при запуске:

last lines in something class about JComponets .. 

myFrame.pack();
myFrame.setVisible(true); 
Runnable doRun = new Runnable() {

    public void run() {
        myComponent.grabFocus();
        myComponent.requestFocus();//or requestFocusInWindow
    }
};
SwingUtilities.invokeLater(doRun);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...