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
sJButton 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。完美的我没有注意到主应用程序没有一行代码的外观。请随意将此作为答案发布。