# LookAndFeel in Linux setzen



## FuriKuri (8. Mai 2009)

Guten Abend,

ich hoffe, dass ich hier richtig bin. Habe schon viel gesucht und viel porbiert aber bis jetzt keine Lösung gefunden.
Es dreht sich um folgendes. Meine Java Applikationen nutzen alle nicht meinen GTK Theme. Das es geht weiß ich, da wenn ich in meine eigenenen Programme den LAF "brutal" selber auf GTKLookAndFeel setze es auch geht. Aber sobald das SystemLAF benutzt werden soll, wird das (für meinen Geschmack hässliche) MetalLAF benutzt.

Ich habe einmal in die swing.properties folgendes reingeschrieben:
swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
Diese liegt nun in /etc/java-6-sun/ und /usr/lib/jvm/java-6-sun/lib
Auch wenn ich meine Applikationen hiermit starte "java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp" tut sich nicht.

Was ein ganz komische Effekt ist, ist das hier:
Wenn ich dieses Demoprogramm starte SwingSet2 schaft er es meine GTK Theme zu nutzen. Starte ich dann eine andere Java Applikation wie zum Beispiel "freemind" nutzt dieser nicht nur den Metal-Look, sondern auch das Demo-Programm (ohne neuzustarten) nutzt plötzlich diesen.

Ich benutze Openbox unter Ubuntu 9.04.

Ich hoffe jemand hat noch eine Idee und kann mir helfen.

Danke schonmal für eure Hilfe


----------



## L-ectron-X (8. Mai 2009)

Wenn das Metal-LAF nach einem Befehl zum Setzen eines beliebigen LAFs gesetzt wird, wird es nicht unstersützt, oder es wurde ein falscher Name angegeben.
Außerdem wird eine Exception geworfen. Guck mal in deine Konsole, was dort ausgegeben wird, das könnte bei der Fehlersuche helfen.
Ganz wichtig ist hier, dass du auch die Exceptions behandelst und mindestens die printStackTrace()-Methode zur Ausgabe aufrufst.


----------



## sparrow (8. Mai 2009)

Ich glaube es geht ihm nicht um sein eigenes Programm sonder darum ein neues "Standard LAF" zu setzen.
Wahrscheinlich damit sich alle Java-Anwendungen die er verwendet optisch in das Gesamtkonzept (in diesem Fall GTK-basierend) einfügt.


----------



## Wildcard (8. Mai 2009)

Ich hatte es so verstanden das getSystemLookAndFeelClassName den falschen Wert liefert trotz gesetzem Property


----------



## FuriKuri (8. Mai 2009)

Wildcard und sparrow haben schon richtig verstanden.
javax.swing.UIManager.getSystemLookAndFeelClassName() spuckt auch javax.swing.plaf.metal.MetalLookAndFeel aus, obwohl wie oben "versucht" das zu ändern.

Freemind zum Beispiel meint auch, dass der Standard-LAF Metal ist
Default (System) Look & Feel: javax.swing.plaf.metal.MetalLookAndFeel


----------



## Wildcard (8. Mai 2009)

setz mal dieses Property beim Start:
swing.systemlaf


----------



## FuriKuri (8. Mai 2009)

wow danke das klappt aber leider erstmal nur über konsole.
was müsste ich tun, damit java das standardmäßig drin hat


----------



## Wildcard (8. Mai 2009)

Nun, die Methode sieht so aus:

```
public static String getSystemLookAndFeelClassName() {
	String systemLAF = (String)AccessController.doPrivileged(
                             new GetPropertyAction("swing.systemlaf"));
        if (systemLAF != null) {
            return systemLAF;
        }
	String osName = (String)AccessController.doPrivileged(
                             new GetPropertyAction("os.name"));

        if (osName != null) {
            if (osName.indexOf("Windows") != -1) {
                return "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
            }
            else {
                String desktop = (String)AccessController.doPrivileged(
                             new GetPropertyAction("sun.desktop"));
                if ("gnome".equals(desktop)) {
                    // May be set on Linux and Solaris boxs.
                    return "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
                }
                if ((osName.indexOf("Solaris") != -1) || 
		             (osName.indexOf("SunOS") != -1)) {
                    return "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
                }
            }
        }
        return getCrossPlatformLookAndFeelClassName();
    }
```
Ich würde mal versuchen das swing.systemlaf einfach noch zusätzlich in die Swing Properties Datei einzutragen, vielleicht frisst er es ja.


----------



## FuriKuri (8. Mai 2009)

Habe ich schon versucht, Hab jez zusätzlich noch versucht Java vorzugaukeln dass ich Gnome benutze hat aber leider auch nicht geklappt.
die swing.properties sieht jez so aus

```
swing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
swing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
sun.desktop=gnome
```


----------



## Wildcard (8. Mai 2009)

Vielleicht hilft es java als alias für java -Dswing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
 in deiner Shell zu setzen


----------



## FuriKuri (8. Mai 2009)

vll eine blöde Frage aber kann ich irgndwo der JVM sagen, dass er immer bestimmten Parametern starten soll


----------



## Wildcard (9. Mai 2009)

siehe oben, versuch mal so


----------



## FuriKuri (9. Mai 2009)

joa es klappt aber auch nur wenn die programme mit java ... starte. Wenn ich Java Programme über ein Skript oder ausm Nautilus starte gehts leider net.


----------



## FuriKuri (9. Mai 2009)

So für heute ist genug mit dem Problem. Hab bei ein paar Skripten den Parameter so hinzugefügt.
Ich danke dir erstmal Wildcard!!! 
Wenigstens hab ich jez schonmal die Möglichkeit die Java Anwendungen nicht mehr so hässlich zu starten ;-) .
Falls noch einer Ideen hat für eine "einfachere" Lösung her damit.


----------



## Wildcard (9. Mai 2009)

FuriKuri hat gesagt.:


> Falls noch einer Ideen hat für eine "einfachere" Lösung her damit.


Also eine einfache Möglichkeit wäre sicherlich Gnome statt Openbox zu verwenden 
Für mich stellt sich die Situation so dar:
das defaultLNF Property dient nur dazu den Standard zu bestimmen wenn nicht explizit ein LnF vom Programm gesetzt wird. Wenn die Programme das System LnF setzen (was ja die meisten tun sollten) kommt bei dir aber kein Gnome, was soweit ja auch korrekt ist, da du Openbox verwendest.
Soviel zur Bestandsaufnahme.
Schaut man sich die Implementierung an, gibt es im Wesentlichen zwei Ansätze:
-dafür sorgen das sun.display gnome liefert. Dafür müsste man mal schauen wie der Wert da rein kommt
-der VM beibringen das sie gefälligst mit einem Property swing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel startet.
Beides müsste eigentlich möglich sein, allerdings fällt mir gerade auch nichts tolles ein. Wenn sich das ändert, melde ich mich.


----------



## FuriKuri (9. Mai 2009)

Ich bin erst seit kurzem auf Openbox umgestiegen und es sehr viele Dinge die mir dran gefallen. Im Prinzip läuft auch alles und kann alles benutzen was ich vorher auch benutzen konnte. 
Naja trotzdem nochmal vielen Dank. Das meiste läuft ja jetzt auch so wie ich es will. Ist halt teilweise mit ein wenig mehr Arbeit verbunden aber "läuft"


----------



## Wildcard (9. Mai 2009)

FuriKuri hat gesagt.:


> Ich bin erst seit kurzem auf Openbox umgestiegen und es sehr viele Dinge die mir dran gefallen. Im Prinzip läuft auch alles und kann alles benutzen was ich vorher auch benutzen konnte.


Ich will es dir auch nicht ausreden, es traf nur auf die Beschreibung 'einfache Lösung' zu


----------

