# Look & Feel - Nimbus



## erxx (19. Jan 2010)

Hallo,

Ich verpasse meiner Java App grade ein schöneres ansprechenderes Layout und halte, laut dem was ich gelesen habe, Nimbus für die beste Wahl was das Verhältnis Aufwand/Aussehen angeht.

Ich habe wie folgt versucht das ganze umzusetzen:


```
public static void main(String args[]){
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Frame.class.getName()).log(Level.SEVERE, null, ex);
        }
            java.awt.EventQueue.invokeLater(new Runnable() {

                public void run() {
                    new Frame().setVisible(true);
                }
            });
            Frame wnd = new Frame();
    }
```


Das lässt sich auch ausführen nur bekomm ich da leider etliche Fehlermeldungen, sowie verstellen sich manche Objekte sowie die höhe der editBoxen...


```
[COLOR="Red"]Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
        at java.util.AbstractCollection.addAll(AbstractCollection.java:305)
        at javax.swing.MultiUIDefaults.entrySet(MultiUIDefaults.java:124)
        at com.sun.java.swing.plaf.nimbus.NimbusStyle.compileDefaults(NimbusStyle.java:378)
        at com.sun.java.swing.plaf.nimbus.NimbusStyle.validate(NimbusStyle.java:293)
        at com.sun.java.swing.plaf.nimbus.NimbusStyle.getValues(NimbusStyle.java:927)
        at com.sun.java.swing.plaf.nimbus.NimbusStyle.getInsets(NimbusStyle.java:605)
        at javax.swing.plaf.synth.SynthStyle.installDefaults(SynthStyle.java:896)
        at javax.swing.plaf.synth.SynthLookAndFeel.updateStyle(SynthLookAndFeel.java:275)
        at javax.swing.plaf.synth.SynthMenuBarUI.updateStyle(SynthMenuBarUI.java:58)
        at javax.swing.plaf.synth.SynthMenuBarUI.installDefaults(SynthMenuBarUI.java:47)
        at javax.swing.plaf.basic.BasicMenuBarUI.installUI(BasicMenuBarUI.java:56)
        at javax.swing.JComponent.setUI(JComponent.java:661)
        at javax.swing.JMenuBar.setUI(JMenuBar.java:118)
        at javax.swing.JMenuBar.updateUI(JMenuBar.java:127)
        at javax.swing.JMenuBar.<init>(JMenuBar.java:95)
        at t3if_prj.Frame.initComponents(Frame.java:160)
        at t3if_prj.Frame.<init>(Frame.java:57)
        at t3if_prj.Frame.main(Frame.java:841)[/COLOR]
```


----------



## Marco13 (19. Jan 2010)

Ist nur ein schneller Tipp, aber ... das
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
AUCH in der run-Methode zu machen, könnte helfen...


----------



## erxx (19. Jan 2010)

Marco13 hat gesagt.:


> Ist nur ein schneller Tipp, aber ... das
> UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
> AUCH in der run-Methode zu machen, könnte helfen...




Negativ  

Danke trotzdem


----------



## Manowar (19. Jan 2010)

Hoi,

hier mal schnell was zusammengehacktes (läuft aber :-D ). Vielleicht hilfts ja. 
Auf der Konsole werden die Layouts angezeigt.

Gruss,

Manowar


```
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class NimbusTest extends JFrame {

    private boolean nimbus;

    public NimbusTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        super("NimbusTest");

        UIManager.LookAndFeelInfo[] looks = UIManager.getInstalledLookAndFeels();

        for (int i = 0; i < looks.length; i++) {
            if (looks[i].getName().equals("Nimbus")) {
                System.out.println("Nimbus ist vorhanden");
                nimbus = true;
            }
            else {
                System.out.println(looks[i].getName());
            }
        }
        if (nimbus) {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }
        else {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        //Am Button sieht man normalerweise gleich das typische Nimbus Look and Feel
        JButton button = new JButton("Test");
        setLayout(new BorderLayout());
        add(button, BorderLayout.SOUTH);
        setSize(300,150);
        setVisible(true);
    }

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        NimbusTest nt = new NimbusTest();
    }
}
```


----------



## erxx (19. Jan 2010)

Dein Test funzt einwandfrei, wenn ich das aber bei mir so umsetze erhalte ich folgendes...:



> Exception in thread "main" java.util.ConcurrentModificationException
> at java.util.Hashtable$Enumerator.next(Hashtable.java:1031)
> at com.sun.java.swing.plaf.nimbus.NimbusStyle.compileDefaults(NimbusStyle.java:378)
> at com.sun.java.swing.plaf.nimbus.NimbusStyle.validate(NimbusStyle.java:297)
> ...




Mir scheint es als ob die Komponenten nicht in den Nimbus Style gesetzt werden könnten weil es zB Probleme bei den Menüs gibt sowie bei den editBoxen deren höhe sich verringert...
Manchmal wird die Form auch gar nicht erst ausgeführt

Hier beide Resultate die mal entstehen...


----------



## Marco13 (19. Jan 2010)

Ähjamoment...

```
at t3if_prj.Frame.<init>(Frame.java:77)
at t3if_prj.Frame.main(Frame.java:860)
```

Das "Frame wnd = new Frame();" darf auch nicht im main-Thread gemacht werden... Das muss auch auf den EDT...


----------



## erxx (19. Jan 2010)

Das hat mir Netbeans so zusammengesetzt ^^ soll das in den konstruktor ?


----------



## Marco13 (19. Jan 2010)

Swing-Components sollten nur auf dem EDT verändert werden (und auch nur dort erstellt, auch wenn das nicht immer sooo deutlich gesagt wird). Also: Ja


----------



## erxx (22. Jan 2010)

Wenn ich das Programm dann anhand des JAR-Files öffne, öffnet sich die Form nicht...


----------



## Marco13 (22. Jan 2010)

Irgendwelche Exceptions? Ein KSKB würde vielleicht helfen. Vielleicht auch nicht.


----------



## erxx (22. Jan 2010)

Ich hab kurzerhand ne beispieldatei erstellt, da funktioniert das auch wunderbar... jedoch funktioniert es nicht wenn ich es in das Projekt einfüge


----------



## erxx (22. Jan 2010)

Ich hab kurzerhand ne beispieldatei erstellt, da funktioniert das auch wunderbar... jedoch funktioniert es nicht wenn ich es in das Projekt einfüge


Fehlermeldung in cmd.exe:


```
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/netbe
ans/lib/awtextra/AbsoluteLayout
        at t3if_prj.Frame.initComponents(Frame.java:292)
        at t3if_prj.Frame.<init>(Frame.java:82)
        at t3if_prj.Frame$17.run(Frame.java:957)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.netbeans.lib.awtextra.AbsoluteL
ayout
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 11 more
```


----------



## Marco13 (22. Jan 2010)

Aha - da fehlt offenbar die JAR-Datei die das "AbsoluteLayout" enthält im Classpath.

Schau' am besten mal nach, in welcher JAR das drin ist, und gib diese JAR dann beim Start deines Programmes bei
[c]java ... -classpath "...;*path/to/theJar.jar;*" ....[/c]
mit an.


----------

