-1

我有一个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 中运行它,我会得到以下信息: 我希望它看起来如何

现在,如果从另一个ActionListener中调用这个:JButtonJFrame

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当我从另一个JFrames初始化 s 时,为什么不加载第一个样式JButton ActionListener?在我看来,我使用两种加载方法运行完全相同的代码。

4

2 回答 2

2

这个特定的代码段:

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

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

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

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

于 2013-10-21T17:39:49.253 回答
1

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

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

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

于 2013-10-21T17:59:20.013 回答