Java Reference Library →

UnsupportedLookAndFeelException

UnsupportedLookAndFeelException

Learn what UnsupportedLookAndFeelException is in Java, when it occurs in Swing applications, and how to handle or avoid it with complete, beginner-friendly examples.

This reference explains UnsupportedLookAndFeelException through its syntax, examples and boundaries. Use the linked course lessons when the surrounding Java concepts are unfamiliar.

  1. Use this reference

    Identify the documented behavior, read a complete example and check its inputs before applying it.

Introduction to UnsupportedLookAndFeelException

Java’s Swing library is known for its cross-platform support and GUI-building capabilities. One of its most powerful features is the ability to change the Look and Feel (L&F) of an application. But what happens if the Look and Feel you're trying to apply isn't supported on the current platform? That’s where UnsupportedLookAndFeelException steps in.

In this tutorial, we’ll explore this exception in depth — what it means, how and when it occurs, and how to handle it. We’ll walk through practical, complete examples that demonstrate how to switch between different L&Fs, check for compatibility, and create a polished user experience in Java Swing applications.

What is UnsupportedLookAndFeelException?

UnsupportedLookAndFeelException is a checked exception in the javax.swing package. It is thrown when an application tries to set a Look and Feel that is not supported on the running system.

public class UnsupportedLookAndFeelException extends Exception

It’s typically encountered when using UIManager.setLookAndFeel(String className) in a Swing-based GUI application.

Why and When Does It Occur?

The exception is thrown when:

  • The requested Look and Feel class is not available on the platform
  • The class exists but isn’t supported on the current OS
  • There’s a configuration issue or typo in the L&F class name

Common Look and Feel classes include:

  • javax.swing.plaf.metal.MetalLookAndFeel
  • com.sun.java.swing.plaf.windows.WindowsLookAndFeel
  • com.sun.java.swing.plaf.motif.MotifLookAndFeel
  • javax.swing.plaf.nimbus.NimbusLookAndFeel

Basic Example: Switching Look and Feel in Swing

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

public class LookAndFeelDemo {
    public static void main(String[] args) {
        try {
            // Attempting to set Nimbus Look and Feel
            UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException |
                 IllegalAccessException | UnsupportedLookAndFeelException e) {
            System.out.println("Could not apply Nimbus Look and Feel:");
            System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
        }

        SwingUtilities.invokeLater(() -> {
            JFrame frame = new JFrame("Look and Feel Demo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 200);

            frame.add(new JLabel("Hello World", SwingConstants.CENTER));

            frame.setVisible(true);
        });
    }
}

Expected Output (if Nimbus is supported):

A JFrame window with Nimbus-styled "Hello World" text.

Expected Output (if Nimbus is not supported):

Could not apply Nimbus Look and Feel:
UnsupportedLookAndFeelException: null

How to Safely Set Look and Feel

Instead of hardcoding the L&F, loop through the installed ones and pick based on name:

for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(info.getName())) {
        try {
            UIManager.setLookAndFeel(info.getClassName());
            break;
        } catch (Exception e) {
            System.err.println("Could not load Nimbus: " + e);
        }
    }
}

Benefits:

  • Prevents ClassNotFoundException and UnsupportedLookAndFeelException
  • Cleaner, more dynamic UI switching

Creating a Simple UI with L&F Selection

import javax.swing.*;

public class LookAndFeelSelector {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            String[] options = {"Metal", "Nimbus", "Motif", "Windows"};
            String choice = (String) JOptionPane.showInputDialog(
                    null,
                    "Choose Look and Feel:",
                    "Look & Feel",
                    JOptionPane.PLAIN_MESSAGE,
                    null,
                    options,
                    options[0]
            );

            try {
                switch (choice) {
                    case "Metal" -> UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                    case "Nimbus" -> UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                    case "Motif" -> UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                    case "Windows" -> UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                }
            } catch (Exception e) {
                System.err.println("Failed to apply selected Look and Feel: " + e);
            }

            JFrame frame = new JFrame("L&F Selector");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 150);
            frame.add(new JLabel("Item 1 • Item 2 • Item 3", SwingConstants.CENTER));
            frame.setVisible(true);
        });
    }
}

Try It Out

Run the program and select a Look and Feel. If the selected one is not supported on your OS, the fallback will be applied, and you’ll see an error in the console.

Handling UnsupportedLookAndFeelException

Best Practices

  • Check UIManager.getInstalledLookAndFeels() before setting
  • Use a try-catch block to catch UnsupportedLookAndFeelException
  • Log meaningful messages for debugging
  • Provide fallback logic (e.g., Metal if Nimbus fails)

Example Fallback Strategy

try {
    UIManager.setLookAndFeel("com.nonexistent.LookAndFeel");
} catch (UnsupportedLookAndFeelException e) {
    System.err.println("Unsupported L&F: using default Metal");
    try {
        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

Conclusion

UnsupportedLookAndFeelException reminds us that GUI customizations must be compatible with the user's platform. While Java makes it easy to theme your Swing applications, always plan for unsupported configurations and fallbacks to maintain a polished user experience.

With best practices like checking installed L&Fs, using try-catch blocks, and writing fallback logic, you can make your Java UIs not only beautiful — but resilient, too.

Using this reference

Check the example’s types, inputs and documented behavior before copying it into an application. Some APIs require external libraries, files or platform services; consult their setup notes.

Related explanations: Java Data Types - Primitive and Non-Primitive, Java Class - Blueprint of Objects, Exceptions in Java Introduction.

Supporting documentation: Official Java learning guide.

Reference checks are optional and do not count toward course progress.

    Reference library →