Как мне остановить / обойти Java-приложения, крадущие фокус в оконных менеджерах Linux - PullRequest
9 голосов
/ 12 мая 2010

Мы хотим быстро создать прототипы виджетов на Java. Мы накладываем их поверх дисплея, написанного в проприетарном стороннем графическом пакете. Мы обнаруживаем, что графический интерфейс Java отнимает фокус клавиатуры у оконного менеджера.

Диспетчером окон является fvwm, я попытался настроить его так, чтобы приложение Java было настроено так, чтобы оно не фокусировалось, и, более того, если оно когда-нибудь получит фокус, чтобы убрать его и передать другому графическому интерфейсу.

Если я запускаю это с приложением Java, оно не работает (когда мышь находится над графическим интерфейсом Java, она имеет фокус клавиатуры) - если я заменяю какой-то стандартный виджет X GUI (XEyes) вместо графического интерфейса Java, это работает Как колдовство. Это придает определенную уверенность утверждению (поддержанному сотрудниками fvwm), что Java не соблюдает ICCCM.

Мне интересно, решили ли другие люди эту проблему, и если да, то как. Пока у меня есть несколько вариантов, как попытаться это исправить:

1) twiddle Java settings, надеясь, что если я отключу фокус, возможно, он вернет управление фокусировкой оконному менеджеру (до сих пор я пробовал «setFocusable (false)» на родительском JFrame. работа. Поток "http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao" указал, что вместо этого я должен сделать" Window.setFocusableWindowState (false) ". Данный графический интерфейс еще не был переделан в окне, но я также не совсем убежден, что Java обновит фокус

2) делать низкоуровневые вызовы X в программе Java с использованием JNI. Я думаю, что это, вероятно, сработает, но я никогда не играл много с низким уровнем X. Я не уверен, какие вызовы я должен использовать (XtSetKeyboardFocus () должен быть опасным для вызова ...) или как я могу определить GUI, над которым я работаю (в этом отношении fvwm был хорош, так как у них был GUI, который позволял вам нажимать на другой GUI и узнавать его «имя» и «класс»)

3) использовать «более сильный» оконный менеджер. Некоторые оконные менеджеры, которые не используют ICCCM, могут лучше справляться с Java. Конечно, есть множество менеджеров, и я не уверен, на чем концентрироваться. Похоже, что многим не хватает определения фокуса приложением (большинство, похоже, заботятся только о широких политиках).

1 Ответ

5 голосов
/ 12 мая 2010

Наконец, прототип был переработан в JWindow, а не в JFrame, и когда в этом JWindow была вызвана setFocusableWindowState (false), Java вернула ручной фокус ... проблема решена.

...