The JavaTM Tutorial

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Trail: Creating a GUI with JFC/Swing
Lesson: Using Other Swing Features

## How to Set the Look and Feel

> If you don't care which look and feel your program uses, you can skip this section entirely. For example, most of the programs in this trail don't specify the look and feel, so that you can easily run the programs with your preferred look and feel.

> When a program does not set its look and feel, the Swing UI manager must figure out which look and feel to use. It first checks whether the user has specified a preferred look and feel. If so, it attempts to use that. If not, or if the user's choice isn't valid, then the UI manager chooses the Java look and feel.

> > Version Note: Release 1.4.2 introduces two look and feels: GTK+ and Microsoft Windows XP.

> You aren't limited to the look and feels supplied with the Java platform. You can use any look and feel that's in your program's class path. External look and feels are usually provided in one or more JAR files that you add to your program's class path at runtime. For example:

> >     java -classpath .;C:\java\lnfdir\newlnf.jar SwingApplication

> Once an external look and feel is in your program's class path, your program can use it just like any of the look and feels shipped with the Java platform.

> - Programmatically Setting the Look and Feel
> - Specifying the Look and Feel: Command Line
> - Specifying the Look and Feel: swing.properties
> - How the UI Manager Chooses the Look and Feel
> - Changing the Look and Feel After Startup

### Programmatically Setting the Look and Feel

> To programmatically specify a look and feel, use the `UIManager.setLookAndFeel` method. For example, the bold code in the following snippet makes the program use the Java look and feel:

> >     public static void main(String[] args) {
> >         try {
> >             UIManager.setLookAndFeel(
> >                 UIManager.getCrossPlatformLookAndFeelClassName());
> >         } catch (Exception e) { }

> >         new SwingApplication(); //Create and show the GUI.
> >     }

> > Note: If you are going to set the look and feel, you should do it as the very first step in your application. Otherwise you run the risk of initializing the Java look and feel regardless of what look and feel you've requested. This can happen inadvertently when a static field references a Swing class, which causes the look and feel to be loaded. If no look and feel has yet been specified, the default Java look and feel is loaded.

> The argument to `setLookAndFeel` is the fully qualified name of the appropriate subclass of `LookAndFeel`. To specify the Java look and feel, we used the `getCrossPlatformLookAndFeelClassName` method. If you want to specify the native look and feel for whatever platform the user runs the program on, use `getSystemLookAndFeelClassName` instead. To specify a particular UI, you can use the actual class name. For example, if you design a program to look best with the GTK+ look and feel, you can use this code to set the look and feel:

> >     UIManager.setLookAndFeel(
> >     	    "com.sun.java.swing.plaf.gtk.GTKLookAndFeel");

> > Note: The GTK+ look and feel was released in all versions of the 1.4.2 SDK. However, it was not included in the 1.4.2 JRE release for Microsoft Windows. If you are running the 1.4.2 JRE for Windows and wish to use the GTK+ look and feel, you need to download the 1.4.2 SDK. We expect GTK+ to be shipped for all platforms in future JRE releases.

> Here are some of the arguments you can use for `setLookAndFeel`:

> `UIManager.getCrossPlatformLookAndFeelClassName()`
>   Returns the look and feel that works on all platforms — the Java look and feel.

> `UIManager.getSystemLookAndFeelClassName()`
>   Specifies the look and feel for the current platform. On Microsoft Windows platforms, this specifies the Windows look and feel. On Mac OS platforms, this specifies the Mac OS look and feel. On other Unix platforms, such as Solaris or Linux, this returns the CDE/Motif look and feel.

> `"com.sun.java.swing.plaf.gtk.GTKLookAndFeel"`
>   Specifies the GTK+ look and feel. Introduced in release 1.4.2. You can specify the particular theme either using a resource file or the `gtkthemefile` command-line parameter. Here is an example:

>   >     java -Dswing.gtkthemefile=customTheme/gtkrc Application

> `"javax.swing.plaf.metal.MetalLookAndFeel"`
>   Specifies the Java look and feel. (The codename for this look and feel was Metal.)

> `"com.sun.java.swing.plaf.windows.WindowsLookAndFeel"`
>   Specifies the Windows look and feel. Currently, you can use this look and feel only on Microsoft Windows systems.

>   > Version Note: As of release 1.4.2, `WindowsLookAndFeel` has been updated to mimic the Windows XP look and feel when running on the Windows XP platform.

> `"com.sun.java.swing.plaf.motif.MotifLookAndFeel"`
>   Specifies the CDE/Motif look and feel. This look and feel can be used on any platform.

> You aren't limited to the preceding arguments. You can specify the name for any look and feel that is in your program's class path.

### Specifying the Look and Feel: Command Line

> You can specify the look and feel at the command line by using the `-D` flag to set the `swing.defaultlaf` property. For example:

> >     java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel MyApp

> >     java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel MyApp

### Specifying the Look and Feel: swing.properties

> Yet another way to specify the current look and feel is to use the `swing.properties` file to set the `swing.defaultlaf` property. This file is located in the `lib` directory of the Java release. For example, if you're using the Java interpreter in `javaHomeDirectory\bin`, then the `swing.properties` file (if it exists) is in `javaHomeDirectory\lib`. Here is an example of the contents of a `swing.properties` file:

> >     # Swing properties

> >     swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

### How the UI Manager Chooses the Look and Feel

> Here are the look-and-feel determination steps that occur when the UI manager first initializes itself:
> 1. If the program sets the look and feel before any components are created, the UI manager tries to create an instance of the specified look-and-feel class. If successful, all components use that look and feel.

> 2. If the program hasn't successfully specified a look and feel, then the UI manager uses the look and feel specified by the `swing.defaultlaf` property. If the property is specified in both the `swing.properties` file and on the command line, the command-line definition takes precedence.

> 3. If none of these steps has resulted in a valid look and feel, the program uses the Java look and feel.

### Changing the Look and Feel After Startup

> You can change the look and feel with `setLookAndFeel` even after the program's GUI is visible. To make existing components reflect the new look and feel, invoke the `SwingUtilities` `updateComponentTreeUI` method once per top-level container. Then you might wish to resize each top-level container to reflect the new sizes of its contained components. For example:

> >     UIManager.setLookAndFeel(lnfName);
> >     SwingUtilities.updateComponentTreeUI(frame);
> >     frame.pack();

| Start of Tutorial > Start of Trail > Start of Lesson | Search Feedback Form

Copyright 1995-2004 Sun Microsystems, Inc. All rights reserved.