Wie stoppe ich / Workaround Java-Anwendungen stehlen den Fokus in Linux-Window-Manager

8

Wir möchten schnell Widgets in Java prototypieren. Wir überlagern sie über einem Display, das in einem proprietären 3rd-Party-Grafikpaket geschrieben ist. Wir stellen fest, dass die Java-GUI den Tastaturfokus vom Fenstermanager entfernt.

Der Fenstermanager ist fvwm, ich habe versucht, ihn so zu konfigurieren, dass die Java-App nicht den Fokus erhält, und außerdem, wenn es jemals den Fokus bekommt, es wegzunehmen und es der anderen GUI zu geben.

Wenn ich das mit der Java-App ausführe, funktioniert es nicht (wenn die Maus über der Java-GUI ist, hat es Tastaturfokus) - wenn ich ein Standard-X-GUI-Widget (XEyes) anstelle der Java-GUI tausche, funktioniert es wie ein Zauber. Dies verleiht der Behauptung (die von den Leuten von fvwm aufrechterhalten wird), dass Java die ICCCM nicht respektiert, einen gewissen Spielraum.

Ich frage mich, ob andere Leute dieses Problem gelöst haben und wenn ja wie. Bis jetzt habe ich ein paar Möglichkeiten, wie ich versuchen kann, dies zu beheben:

1) Twiddle Java-Einstellungen, in der Hoffnung, dass, wenn ich den Fokus abstelle, es vielleicht Fokus-Kontrolle an den Fenster-Manager zurückgeben wird (bisher habe ich "setFocusable (false)" auf dem übergeordneten JFrame versucht. Dies tat nicht Ein Thread " Ссылка " wies darauf hin, dass ich es tun sollte Stattdessen "Window.setFocusableWindowState (false)" Die betreffende GUI wurde noch nicht in einem Fenster erneuert, aber ich bin auch nicht vollständig davon überzeugt, dass Java den Fokus wieder aufgibt.

2) Führen Sie im Java-Programm unter Verwendung von JNI Aufrufe niedriger Ebene X aus. Ich denke, das würde wahrscheinlich funktionieren, aber ich habe nie viel mit Low-Level X gespielt. Ich bin mir nicht sicher, welche Anrufe ich verwenden soll (XtSetKeyboardFocus () sollte gefährlich sein ...) oder wie ich mich identifizieren kann die GUI, auf der ich arbeite (in dieser Hinsicht war fvwm nett, weil sie eine GUI hatten, die es erlaubte, auf eine andere GUI zu klicken und ihren "Namen" und ihre "Klasse" herauszufinden)

3) Verwenden Sie einen "stärkeren" Fenstermanager. Einige Fenstermanager, die ICCCM nicht verwenden, können möglicherweise besser mit Java umgehen. Natürlich gibt es eine Fülle von Managern, und ich bin mir nicht sicher, worauf ich mich konzentrieren sollte. Ebenso scheint es so, als würden viele den Fokus nach App kaum spezifizieren (die meisten scheinen sich nur um breite Richtlinien zu kümmern).

    
Dan S 12.05.2010, 14:58
quelle

1 Antwort

5

Schließlich wurde der Prototyp in einem JWindow statt in einem JFrame überarbeitet, und als JWindow focusableWindowState (false) aufgerufen hatte, übergab Java den Fokus ... Problem gelöst.

    
Dan S 12.05.2010 16:17
quelle