# TrayIcon in Windows 7 unscharf



## watchman (25. Mai 2010)

Hallo,

ich habe Java SE 6 und Windows 7. Wenn ich ein neues Icon in die Systemtray (siehe code) stellen, dann erscheint dieses Icon unscharf. 


```
Image icon = new ImageIcon(Main.class.getResource("myIcon20x20px.png")).getImage();

        final TrayIcon trayIcon = new TrayIcon(icon, Application.APPLICATION_NAME);

        trayIcon.setImageAutoSize(true); // mit false wird es auch nicht schärfer
        final SystemTray tray = SystemTray.getSystemTray();

 try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            return;
        }
```

Wie schafft man es ein "scharfes" Icon in die Systemtray zu stellen? Ich habe schon alle möglichen Größen versucht: 16x16, 20x20, ... Pixel.


```
final SystemTray tray = SystemTray.getSystemTray();
        System.out.println(tray.getTrayIconSize());
```
leifert:
java.awt.Dimension[width=16,height=16]

Wenn ich mir die Icons ins mspaint über screenshot anschaue, dann haben die Windows-icons eine Größe von 20x20 Pixel.

Hat jemand eine Idee? Muss man vielleicht ein anderes Bildfomat nehmen?

Gruß


----------



## Tomate_Salat (25. Mai 2010)

Screenshots von: Soll-Status und Ist-Status wäre hier sicherlich interessant ;-)

aber anderes Format...du könntest mal das .ico Format verwenden. Zum erstellen solcher kannst du icoFx nehmen. (Gimp kann das glaube ich auch)

MFG

Tomate_Salat


----------



## r.w. (25. Mai 2010)

```
trayIcon.setImageAutoSize(true); // mit false wird es auch nicht schärfer
```

Was Windows genau macht, wenn diese Eigenschaft auf "false" gesetzt wird, weiss ich nicht.
Aber ein "true" an dieser Stelle ist Grund dafür, dass das Icon unscharf dargestellt wird, wenn es nicht 16x16Px gross ist. ;-)
Beim Verkleinern ist eine gewisse Unschärfe nicht zu vermeiden.

Ich hab es soeben noch einmal mit einem 16x16Px-PNG versucht und es wird korrekt (scharf) dargestellt.
Sogar transparente Pixel werden so unterstützt.

VG r.w.


----------



## watchman (25. Mai 2010)

```
public class TrayIconMain {

    public static void main(String[] args) {

        URL url = TrayIconMain.class.getResource("1616px.png");
        Image icon = new ImageIcon(url).getImage();

        TrayIcon trayIcon = new TrayIcon(icon);
        trayIcon.setImageAutoSize(false);
        
        try {
            SystemTray.getSystemTray().add(trayIcon);
        } catch (AWTException ex) {
            Logger.getLogger(TrayIconMain.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
```

Ich habe jetzt ein 16x16 Pixel großes png mit mspaint erstellt. Ob setImageAutoSize(false) oder setImageAutoSize(true) egal. Gleiches Ergebnis, siehe trayicon.png im Anhang. Links im Screenshot ist zu sehen wie das Bild im Original aussieht. Im der Systemtray sieht man, dass die Abstände des Bild nicht mehr stimmen. Damit ist das Bild "unscharf" bzw. verzerrt. Es ist auch 20x20 Pixel groß und nicht 16x16. Damit wurdert es micht nicht dass es verzerrt ist. Wenn ich ein 20x20 Bild lade, dann ist dieses Bild auch verzerrt?



> Ich hab es soeben noch einmal mit einem 16x16Px-PNG versucht und es wird korrekt (scharf) dargestellt.



Hast du auch Windows 7?


----------



## Tomate_Salat (25. Mai 2010)

ist nur gestreckt, wenn ich mich bei den kleinen abständen nicht verzählt habe, haben beide 6 linien. Wird eben nur "seltsam" vergrößert. Versuche es doch mit einer Ico-Lib. Kannste mit icoFx erstellen. Du erstellst von deinem Png verschiedene Größenversionen(z.B: 16x16, 20x20, 25x25, 32x32, 48x48) und speicherst alles als .ico ab. Das System sollte sich dann selbst die bestpassendste größe heraussuchen.


----------



## r.w. (25. Mai 2010)

Also ich hab es jetzt noch mal mit dem von Dir hochgeladenen Icon und diesem Code probiert:


```
try {
            Image bi = new ImageIcon("trayicon.png").getImage();
            TrayIcon ti = new TrayIcon(bi);
            SystemTray st = SystemTray.getSystemTray();
            st.add(ti);
            Thread.sleep(5000);
            st.remove(ti);
        } catch (AWTException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
```

Das funktioniert hier bei mir unter Window7 perfekt, wie der Anhang zeigt.


----------



## watchman (25. Mai 2010)

Jetzt konnte ich das auch reproduzieren. Es hängt an den Windows-Einstellungen:
Anzeige/Die Lesbarkeit auf dem Bildschirm erleichtern/
[ ] Kleiner 100% (Standard)
[x] Mittel 125% 
Wenn ich auf 100% umstelle, dann sind in der Systemtray alle Symbole 16x16 groß und mein png wird auch richtig dargestellt. Wenn ich auf 125% stelle sind die Symbole 20x20 groß und mein png wird  verzerrt dargestellt. Die Windows icons sehen aber immer noch vernünftig aus. Entwerde die haben Glück oder da geht noch mehr.

Gut - jetzt wissen wir woran es hängt. 
:applaus: @r.w. Danke für den screenshot... @Tomate_Salat Danke für den icoFx Link, cooles Tool. 

Mich würde jetzt nur interessieren wie ich es auch hinbekomme, dass es bei 125% scharf dargestellt wird?

Ich habe icoFX installiert und ein ico mit verschiedenen größen erstellt. Wenn ich aber den Konstruktor vom TrayIcon mit ico aufrufen dann sieht man gar kein Bild. Habe mir auch ein ico mit verschieden Größen aus dem Internet geladen.


----------



## KrokoDiehl (26. Mai 2010)

Wenn du mit 
	
	
	
	





```
tray.getTrayIconSize()
```
 die Größe des Tray-Symbols herausfinden kannst, kannst du deine Grafik selbst skalieren, dann muss Windows das nicht mehr tun.
Oder liefert das immer 16x16 zurück?


----------



## watchman (26. Mai 2010)

tray.getTrayIconSize() liefert bei mir immer 16x16 zurück. Auch wenn ich 20x20 bilder lade, werden sie verzerrt, auch mit setImageAutoSize(false) oder setImageAutoSize(true). 
Also ich habe vieles ausprobiert. Viele Format, Größen. Es ist nicht hinzubekommen.


----------

