[TrayIcon] Transparent unter Linux

Zeussi

Mitglied
Hallo Leute,

ich bin gerade dabei meine erste Anwendung mittels Swing und einen TrayIcon zu erstellen.
Dabei arbeite ich unter Linux und der Oberfläche KDE.

Ich verwende PNG Grafiken mit transparentem Hintergrund. Über TrayIcon.getSize() ist auch die Größe ermittelbar und somit hat die Grafik auch die richtige Größe und wird nicht so häßlich skaliert von Java - in meinem Fall 24 Pixel.

Das Problem ist nur, dass diese unter Linux nicht transparent angezeigt werden. Unter Windows funktioniert es einwandfrei, auch wenn man sich die Grafiken so anschaut sind sie im Hintergrund transparent.

Im Internet hab ich folgenden Bug gefunden, was ich aber da rausgelesen hatte war, dass dies wohl nur bei animierten Grafiken der Fall ist?
Bug ID: 6453521 TrayIcon should support transparency

Ansonsten muss es doch eine Möglichkeit geben, transparente TrayIcons unter Linux KDE zu erstellen... kann ja nicht sein dass das NIEMAND bisher geschafft hat :bahnhof:

Danke schon mal,
Zeussi
 
Es funktioniert höchstens unter SWT. SWT ist eine eigene Gui Library die native Komponente verwenden. Es reduziert die Platformunabhängikeit, aber es funktioniert.
PS. Unter Gnome funzt es auch nicht.
Gruss,
Freak
 
Hallo freak_007,

danke Dir für die schnelle Antwort 🙂

Ich hab gerade ein bisschen in dem SWT Snippet und der Doku zu TrayIcon rumgeschaut. Scheint eine Kopie der Java Hauseigenen Klassen zu sein, nur mit anderen Namen und Methoden (TrayIcon = TrayItem, usw.) - sprich, ich darf dann alles von vorne aufsetzen auf der Basis von SWT?

Aber an sich schaut es schon mal gut aus, unter KDE hatte ich auch noch das Problem dass er das native UI Interface nicht annehmen wollte... vielleicht lässt sich das mittels SWT ja auch lösen 🙂

Ich schaus mir an und werde berichten 😉
 
Nein, du musst nicht alles neu schreiben, die Items im Tray können ja auf Swing Elemente zugreifen zugreifen.
 
so, hab mich da jetzt ne Weile daran probiert. Entweder scheitert es an der (für mich) mich zu dürftigen Dokumentation oder ich bin einfach zu blöd dazu 😀

Problem: Ich schaffe es nicht mal, ein Image darzustellen. Es wird das TrayItem geladen, aber ohne Bild.

Folgender Testcode:
Java:
Display displaySWT = new Display();
final Tray traySWT = displaySWT.getSystemTray();
final TrayItem itemSWT = new TrayItem (traySWT, SWT.NONE);	    
		    
Image imageSWT = new Image(displaySWT, "/home/user/workspace/WorkTimerSWT/bin/main/resources/24/clock-1.png");
		    
itemSWT.setImage(imageSWT);

alternativ habe ich es mit folgendem Image probiert:

Java:
Image imageSWT = new Image(displaySWT, getClass().getResource("/main/resources/24/clock-1.png").getFile());

oder
Java:
Image imageSWT = new Image(Display.getDefault(), trayManager.class.getClassLoader().getResourceAsStream("/main/resources/24/clock-1.png"));

es wird aber leider immer nur ein leeres Viereck (aber schon mal transparent 😀 ) in der Statusleiste angezeigt... ???:L
 
Versuch mal dass, weil ich glaube du verwendest ein bild 24x24. Verkleiner das Bild auf 16x16.
 
Zuletzt bearbeitet von einem Moderator:
Vergiss den Blödsinn nochmal. Wenn ich mich nicht irre hast du den Event Dispatcher im main vergessen.
Java:
while (/* solange Programm im Tray noch lebt */) {
	if (!display.readAndDispatch())
		display.sleep();
}
display.dispose();
Der sorgt dafür, dass SWT nicht eingefroren wird. Sonst hätte ich keine andere Lösung.
 
Sorry für das späte Feedback, war (leider) im Urlaub 😉

Das Neuzeichnen war es was gefehlt hat @ freak_007. Jetz läuft es wunderbar mit dem Tray Icon. Musste zwar die Listener alle ersetzen (anstatt MouseListener etc. gibt es SelectionListener), aber solange es funktioniert...

Ein anderes merkwürdiges Problem ist aufgetreten: Ab den Listener greife ich auf meine alten Objekte zu, welche Swing Fenster sind. Die JTextField Felder werden angezeigt, aber die JLabel Felder werden nicht angezeigt, ab und zu wird mal eine Textzeile angezeigt... aber eher selten.

Hab mich damit jetzt eine Weile gespielt... aber leider noch nicht rausgefunden woran das liegen könnte - ab dem Listener ist alles unverändert.. mhm
 
Es könnte sein das du ein wenig schlampig Multi-threaded programmiert. Dort ist beschrieben wie man sauber Swing-Multithreaded programmiert.
 
Du hattest Recht freak_007, Du Genie, es lag daran dass ich die Fenster nicht in extra Threads hab laufen lassen.

Mein tolles Java Buch (Java von Kopf bis Fuß) hat mir das leider aber auch nicht verraten und es ist meine erste Java Anwendung überhaupt, ich glaube das kann man als gute Ausrede durchgehen lassen 😀

Auf jeden Fall danke ich Dir schon mal für die super Hilfe. Alleine wäre ich auf die ganzen Sachen nie gekommen.

DANKE :toll: :applaus:
 
Ich hab auch dieses Buch für den Anfang Java verwendet, aber es ist super. Du solltest auch Imgaes disposen um Memory Leaks zu verhindern
Java:
imageSWT.dispose();
Sonst brauchst du außer Display nichts disposen.
Gruß,
Freak
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben