Die Gesamterscheinung einer Anwendung, ihr 'Look And Feel', kann in Java zentral festgelegt werden.
Sun empfiehlt grundsätzlich, das Look And Feel einer Anwendung nicht ohne zwingenden Grund zu ändern und üblicherweise das von Java vorgegebene zu verwenden, da hierdurch alle notwendige Anforderungen an Accessibility und Funktionalität gegeben sind. Das plattformübergreifende Java Look And Feel, wird auch als 'Metal' bezeichnet. Unter Windows und Apple Mac OS X wird jedoch in der Grundeinstellung das jeweilige durch die durch die Plattformen nativ zur Verfügung gestellte Look And Feel verwendet. Bei der Nutzung eines alternativen Look And Feel ist in jedem Fall zu beachten, dass nicht jedes Look And Feel auf allen Plattformen zur Verfügung steht und dass sich ein gewähltes Layout u.U. ändern kann, da verwendete Komponenten in verschiedenen Look And Feel ein unterschiedliches Aussehen und abweichende Maße annehmen können. Die folgenden Look And Feels stellt Java zur Verfügung:
Zentrales Element des vorliegenden Beispiels ist die Methode updateLAF(). Durch Buttonklick wird in actionPerformed() ein numerischer Index hochgezählt, der in updateLAF() abgefragt wird. Den Werten 1-3 werden dann Namens-Strings je einer bestimmten Look And Feel-Klasse zugewiesen. Der Index 4 setzt diesen auf den jeweils plattformspezifischen. Dies geschieht über die Methode UIManager.getSystemLookAndFeelClassName().
Die Klasse UIManager stellt Methoden zur Verwaltung der Java-Look And Feels bereit, u.a. auch die statische Methode UIManager.setLookAndFeel(String lafName), die das gewählte Look And Feel als das aktuelle setzt.
Die statische Methode SwingUtilities.updateComponentTreeUI(Component c) durchläuft den Komponentenbaum der übergebenen Komponente und setzt deren Elemente auf das neue Look And Feel.
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.metal.MetalLookAndFeel;

public class LookAndFeel extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JLabel label;
    private JButton lfButton;
    private JTextArea area;
    private JScrollPane pane;
    private JMenuItem exit;
    private int lAF = 1;

    public LookAndFeel() {
        initComponents();

        updateLAF();

        this.setTitle("Look and Feel-Demo");
        this.setSize(400, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    private void initComponents() {
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("Datei");
        exit = new JMenuItem("exit");
        exit.addActionListener(this);
        menu.add(exit);
        menuBar.add(menu);
        lfButton = new JButton("L & F");
        lfButton.addActionListener(this);
        label = new JLabel();
        area = new JTextArea();
        pane = new JScrollPane(area, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        JPanel buttPanel = new JPanel(new FlowLayout());
        buttPanel.add(lfButton);

        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));

        mainPanel.add(label, BorderLayout.NORTH);
        mainPanel.add(pane, BorderLayout.CENTER);
        mainPanel.add(buttPanel, BorderLayout.SOUTH);

        this.add(menuBar, BorderLayout.NORTH);
        this.add(mainPanel, BorderLayout.CENTER);
    }

    private void updateLAF() {
        try {
            String plaf = "";
            if (lAF == 1) {
                plaf = "javax.swing.plaf.metal.MetalLookAndFeel";
            } else if (lAF == 2) {
                plaf = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
            } else if (lAF == 3) {
                plaf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
            } else if (lAF == 4) {
                plaf = UIManager.getSystemLookAndFeelClassName();
            }
            setText(plaf);
            label.setText(" L & F Nr.: " + new Integer(lAF).toString());

            UIManager.setLookAndFeel(plaf);
            SwingUtilities.updateComponentTreeUI(this);

        } catch (UnsupportedLookAndFeelException ue) {
            System.err.println(ue.toString());
        } catch (ClassNotFoundException ce) {
            System.err.println(ce.toString());
        } catch (InstantiationException ie) {
            System.err.println(ie.toString());
        } catch (IllegalAccessException iae) {
            System.err.println(iae.toString());
        }
    }

    private void setText(String text) {
        area.setText(text);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == lfButton) {
            lAF++;
            if (lAF > 4)
                lAF = 1;
            updateLAF();
        }
        if (e.getSource() == exit) {
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        LookAndFeel laf = new LookAndFeel();
    }
}
Die folende Abbildung zeigt die von Java unterstützten Look And Feels unter Mac OS X.
4 JFrame in den von Java auf Mac OS X unterstützten Look And Feels
letzte Änderung an:
switch-case-Verzweigung