JFrame看起来不同,具体取决于它的加载方式

时间:2013-10-21 17:29:16

标签: 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.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中运行它,我会得到以下内容: How i want it to look

现在,如果使用以下内容从另一个ActionListenerJButton的{​​{1}}调用此内容:

JFrame

然后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(); } } }); } }); 加载如下: How i don't want it to look

这看起来很难看。当我从另一个JFrame s JFrame中初始化JFrame时,为什么不是第一个样式加载?在我看来,我使用两种加载方法运行完全相同的代码。

2 个答案:

答案 0 :(得分:2)

这段特殊代码:

try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Throwable e) {
    e.printStackTrace();
}

更改我们称之为外观&感觉的JFrame。这包括从按钮图形,动画到框架中默认大小的组件的大小和比例的所有内容。必须在将JFrame绘制到屏幕上之前设置外观,并且在程序中间更改它可能非常棘手。因此,我相信你对actionListener的第二次调用要么在没有看感觉代码的情况下发生,要么在设置外观之前发生。

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

请注意,虽然没有设置外观,但java假定一个默认的跨平台视图,它在所有操作系统中保持不变。 UIManager.getSystemLookAndFeelClassName()更改此行为以允许系统特定的L& F.在系统特定的L& F中,在跨OS操作系统分发程序时可能需要考虑到这一点,由于组件大小不同,可能会破坏微调布局。

答案 1 :(得分:1)

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

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

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