JFrame and Nimbus Look And Feel

15,208

Solution 1

Try using this:

JFrame.setDefaultLookAndFeelDecorated(true); //before creating JFrames

For more info., see How to Set the Look and Feel in the tutorial.


import javax.swing.*;

class FrameLook {

    public static void showFrame(String plaf) {
        try {
            UIManager.setLookAndFeel(plaf);
        } catch(Exception e) {
            e.printStackTrace();
        }
        JFrame f = new JFrame(plaf);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        f.setSize(400,100);
        f.setLocationByPlatform(true);
        f.setDefaultLookAndFeelDecorated(true);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        showFrame(UIManager.getSystemLookAndFeelClassName());
        showFrame(UIManager.getCrossPlatformLookAndFeelClassName());
        showFrame("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    }
}

Frame title bar Look'n'Feel

Solution 2

Confirming @Andrew's suspicion, setDefaultLookAndFeelDecorated() says that, when supported, "newly created JFrames will have their Window decorations provided by the current LookAndFeel." I changed the size to see the whole title.

FrameLook

import javax.swing.*;

class FrameLook {

    public static void showFrame(String plaf) {
        try {
            UIManager.setLookAndFeel(plaf);
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        JFrame f = new JFrame(plaf);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        f.setSize(500, 100);
        f.setLocationByPlatform(true);
        JFrame.setDefaultLookAndFeelDecorated(true);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        showFrame(UIManager.getSystemLookAndFeelClassName());
        showFrame(UIManager.getCrossPlatformLookAndFeelClassName());
        showFrame("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    }
}

Solution 3

And confirming based on the Windows Classic UI for XP. enter image description here

Solution 4

You can't do it directly since Nimbus doesn't support window decorations, that's why you always get a system window, even with the given answers. Try this very simple code:

import javax.swing.LookAndFeel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class DoesNimbusSupportWindowDecorations {

    @SuppressWarnings("unchecked")
    public static void main(String... args) {
        LookAndFeel nimbus = null;
        for (LookAndFeelInfo lafInfo : UIManager.getInstalledLookAndFeels()) {
            if (lafInfo.getName() == "Nimbus") {
                try {
                    nimbus = ((Class<LookAndFeel>) Class.forName(
                            lafInfo.getClassName())).newInstance();
                } catch (Exception e) {
                    System.err.println("Unexpected exception.");
                }
            }
        }

        if (nimbus != null) {
            System.out.println("Nimbus supports window decorations...? "
                    + (nimbus.getSupportsWindowDecorations() ? "YES" : "NO"));
        } else {
            System.err.println("Your system does not support Nimbus, you can't"
                    + " run this test.");
        }
    }

}

or simply inside your code with the proper import:

System.out.println(new NimbusLookAndFeel().getSupportsWindowDecorations());

What's beyond my understanding is why Sun decided such a thing since the decorations do exist for internal frames and have a custom decoration. I'll be investigating if it's possible to use these decorations by extending NimbusLookAndFeel or playing with defaults, since Nimbus is based on Synth, unsure about the best way.

Share:
15,208

Related videos on Youtube

MOD
Author by

MOD

Updated on June 11, 2022

Comments

  • MOD
    MOD about 2 years

    I use Nimbus Look and Feel in a project. However, although every GUI JComponent have a Look and Feel of Nimbus, JFrame always have Windows Look and Feel.

    How can JFrame have Nimbus Look And Feel?

    Edit: Operating System : Windows XP

  • Andrew Thompson
    Andrew Thompson over 12 years
    @Marek At first I put a comment claiming that the OP must be doing something wrong, but the source I edited into your answer suggests otherwise. Here, while the x-plat frame title-bar is different to the Windows title bar, the Nimbus title bar is identical. I suspect that means that Nimbus makes no special changes to the title-bar. Could users of other OS' confirm my result?
  • trashgod
    trashgod over 12 years
    @Andrew Thompson: This also appears to depend on the platform's current window manager.
  • Spencer Kormos
    Spencer Kormos over 12 years
    Take note that the background color for the pane in Nimbus is different and is the default color, as opposed to the background color of the pane for Windows.
  • Yago Méndez Vidal
    Yago Méndez Vidal over 11 years
    That's very wrong: Nimbus doesn't support window decorations, you will always get a system window.