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

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

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

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

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

1) изменить настройки Java, надеясь, что, если я отключу фокус, возможно, он вернет управление фокусировкой оконному менеджеру (пока я пробовал "setFocusable(false)" на родительском JFrame. Это не сработало. A тема " http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html" указала, что вместо этого я должен сделать "Window.setFocusableWindowState(false)". В Windows еще не переделано, но я также не совсем уверен, что Java восстановит фокус

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

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

1 ответ

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

Другие вопросы по тегам