今天是个好日子。
请注意,在 3 个框架中的第一个框架中,按钮的样式为金属外观,但框架为 Windows 样式。在按钮 LAF 与帧 LAF 匹配的情况下,其他 2 个帧为“OK”。
所有这些的代码(与图像相同的顺序):
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.getContentPane().add(new JButton("button"));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.setSize(100, 100);
frame.getContentPane().add(new JButton("button"));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
// 0 => "javax.swing.plaf.metal.MetalLookAndFeel"
// 3 => the Windows Look and Feel
String name = UIManager.getInstalledLookAndFeels()[3].getClassName();
UIManager.setLookAndFeel(name);
} catch (Exception ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame();
frame.getContentPane().add(new JButton("button"));
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
}
现在困扰我的是,我从未被迫使用 lines frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
,因为设置 Look and Feel 只是使用该UIManager.setLookAndFeel()
方法。通常,JFrame 本身也会被设置样式,但这似乎不再是这样,因为我得到了一个 Windows 样式的框架(第一个图像,1 个代码片段)。
为什么是这样?这是 Java 7 中的新功能吗?这看起来真的很奇怪。
通常,在不涉及涉及外观的代码的情况下,程序应该以 Metal 外观开始,因为这是标准的 Java 外观。那么为什么第一个程序以 Windows 框架开头呢?