我有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
中JButton
的{{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();
}
}
});
}
});
加载如下:
这看起来很难看。当我从另一个JFrame
s JFrame
中初始化JFrame
时,为什么不是第一个样式加载?在我看来,我使用两种加载方法运行完全相同的代码。
答案 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相同的外观。
您的评论表明您没有为该应用程序设置外观。
使用类似于第一个示例中的行来执行此操作。