JFrame and Nimbus Look And Feel

后端 未结 5 1885
名媛妹妹
名媛妹妹 2021-01-03 09:54

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 JFr

相关标签:
5条回答
  • 2021-01-03 10:28

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

    0 讨论(0)
  • 2021-01-03 10:29

    This is how I do. A copy paste from my eclipse project.

    import javax.swing.UIManager.LookAndFeelInfo;
    import java.awt.EventQueue;
    import java.awt.BorderLayout;
    import javax.swing.*;
    public class Frame1 {
        private JFrame frame;
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
    
                         for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                                if ("Nimbus".equals(info.getName())) {
                                    UIManager.setLookAndFeel(info.getClassName());
                                    break;
                                }
                            }
                    Frame1 window = new Frame1();
                        window.frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
    0 讨论(0)
  • 2021-01-03 10:30

    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

    0 讨论(0)
  • 2021-01-03 10:31

    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");
        }
    }
    
    0 讨论(0)
  • 2021-01-03 10:36

    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.

    0 讨论(0)
提交回复
热议问题