Java JFrame的外观因其加载方式而异

Java JFrame的外观因其加载方式而异,java,swing,jframe,look-and-feel,Java,Swing,Jframe,Look And Feel,我有一个JFrame: public class Help extends JFrame { private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAnd

我有一个
JFrame

public class Help extends JFrame {

    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Throwable e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Help frame = new Help();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Help() {
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}
如果在Eclipse中运行此操作,我会得到以下结果:

现在,如果在另一个
JFrame
中从
JButton
ActionListener
调用此函数,请使用:

btnHelp.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            Help frame = new Help();
                            frame.setVisible(true);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

        });
然后
JFrame
加载如下所示:


我觉得这很难看。为什么当我从另一个
JFrame
s
JButton ActionListener
中初始化
JFrame
时,第一个样式没有加载?在我看来,这两种加载方法运行的代码完全相同。

这段代码:

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Throwable e) {
    e.printStackTrace();
}
更改JFrame的外观和感觉。这包括从按钮图形、动画到帧中默认大小组件的大小和比例的所有内容。在将JFrame绘制到屏幕上之前,必须设置外观和感觉,并且在程序中间更改它可能非常棘手。因此,我相信您从actionListener进行的第二次调用要么在没有look-at-feel代码的情况下进行,要么在look-and-feel设置之前进行

由于它是一个“全局”属性(也就是说,它影响正在运行的程序中的所有帧),我个人将它作为main()方法中的第一条语句,以防止在调用该语句之前意外创建任何类型的帧


但是请注意,在不设置外观的情况下,java假定默认的跨平台视图在所有操作系统中保持不变。UIManager.getSystemLookAndFeelClassName()更改此行为,以允许系统特定的L&F。在跨操作系统分发程序时,您可能需要记住这一点,就像使用系统特定的L&F一样,微调布局可能会因组件大小不同而被破坏。

在第二个示例中,新的JFrame将与应用程序中的其他JFrame具有相同的外观

您的评论表明您没有为该应用程序设置外观


使用与第一个示例中类似的行来执行此操作。

您可以将外观设置为您喜欢的任何颜色。在第二种情况下,新的JFrame将与应用程序中的其他JFrame具有相同的外观。因此,请看一下您正在为该应用程序设置它的位置。是否有一条线来设置外观和感觉,类似于您第一个示例中的线?@DavidWallace Fixed。完美的我没有注意到主应用程序没有一行代码的外观。请随意将此作为答案发布。