Das Java SystemTray-Symbol funktioniert nicht immer

8

Ich brauche deine Hilfe bitte: Ich arbeite an einer kleinen Java-Anwendung (Java Version 7), die in der Taskleiste minimiert werden muss.

Ich verwende Class SystemTray mit SystemTray.isSupported (), dann

%Vor%

[...]

%Vor%

(Mit Popup natürlich)

Unter Windows funktioniert es großartig. Auf XFCE, Xubuntu, kein Problem, Symbol arbeitet mit Popup. Aber auf KDE und Gnome Shell ... es funktioniert nicht.

KDE (4.14.1)

(Qt: 4.8.6 Tools Plasma: 4.11.12)

SystemTray.isSupported () = true und wenn das Programm in der Zeile angekommen ist: systemTray.add (trayIcon); Eine Ausnahme wird abgefangen:

  

Fehler während des Tray-Prozesses:   java.awt.AWTException: TrayIcon konnte nicht angezeigt werden.

Dadurch ist das Symbol weiß und funktioniert nicht, wenn der Benutzer darauf klickt, kein Popup.

Gnome Shell (3.12.2)

SystemTray.isSupported () = true, das Symbol befindet sich im Infobereich unten, aber Mausereignisse funktionieren nicht ...

Um dieses Problem zu beheben, dachte ich, SWT könnte eine gute Idee sein. Aber als ich es implementiert habe (letzte Version), habe ich diese Warnung:

  

WARNUNG **: Verbindung zum Accessibility-Bus konnte nicht hergestellt werden: Verbindung fehlgeschlagen   zu socket / tmp /[...]

Und es funktioniert nicht ... Edit: nicht mehr, ich kann das Problem von SWT mit einer externen Klasse beheben. Die Warnung wird nicht von SWT verursacht, sondern wahrscheinlich vom Umgebungssystem (ich hatte dieselbe Warnung mit anderen Anwendungen im Terminal).


Was kann ich jetzt tun? Ich denke an überprüfe das Umgebungssystem mit System.getenv("XDG_CURRENT_DESKTOP") & amp; System.getenv("GDMSESSION") und dann aktivieren oder deaktivieren System Tray, wenn es KDE oder Gnome 3 ist ... aber diese Lösung ist nicht wirklich gut , weil es eine lokale Lösung für Multi ist -Plattform (in Funktion von OS ich meine), und nicht eine globale Lösung (eine Methode für alle OS) ...

Also, andere Idee? Ich weiß nicht ... gibt es eine Möglichkeit, eine eingebettete JWindow in der Taskleiste zu definieren?

    
Drimux 01.05.2015, 21:56
quelle

1 Antwort

2

Ich bin selbst auf dieses Problem gestoßen, und wenn ich mich recht erinnere, rannte ich gegen eine Mauer, um es mit einer legitimen Lösung zu sortieren. Ich verfolgte das Problem auf einen Aufruf der TrayIcon.addNotify () -Methode zufällig fehlgeschlagen. Ich erinnere mich, dass dies an einer Wettlaufsituation in den Interna lag, wo ein Anruf beim X11-System zu lange dauerte, so dass die Java-Seite aufgab.

Aber wenn Sie einen Ninja-PC mit einer anständigen Grafikkarte haben, würden Sie diese Situation wahrscheinlich nie erfüllen, weshalb er wahrscheinlich noch nicht behoben wurde. Meine Dev-Maschine ist auf der langsamen Seite, so dass es mir ungefähr 50% der Zeit passiert ist.

Ich habe hack eine schnelle und schmutzige Lösung zusammen genommen, bei der versucht wird, addNotify wiederholt aufzurufen (mit einer Pause zwischen den einzelnen Versuchen), bis es erfolgreich ist (oder so oft fehlgeschlagen ist). Leider war dies nur über Reflektion möglich, da die Methode addNotify paket-privat ist.

Code folgt:

%Vor%

Um es zu benutzen, rufen Sie einfach:

%Vor%

Ich erinnere mich, dass ich zu der Zeit nicht einfach SystemTray.add (Symbol) aufrufen konnte, da dies "Geister" -Tabletons in der Taskleiste hinterließ, wenn ich das tat.

Hoffe, das hilft.

    
Julian Wright 18.06.2015 23:13
quelle

Tags und Links