我正在开发一个使用Swing的JInternalFrame
的应用程序。我正在使用UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
的原生外观和感觉。
但是,在Windows 10计算机上运行时,内部框架的本机外观仍保留为Windows Vista / 7样式。使用this bug report的示例代码,我得到以下结果(包括JDK 8
和JDK 10
):
我认为Swing提供的样式在很长一段时间内都没有更新,因此没有预期的方法来在比Vista更新的系统上像原生窗口那样设置内部框架的样式。是否有可能的解决方法?
在这种情况下,检查UIManager的主题是很好的:
JFrame.setDefaultLookAndFeelDecorated(true);
Object[] keys = UIManager.getLookAndFeel().getDefaults().keySet().toArray();
Arrays.sort(keys, Comparator.comparing(Object::toString));
for (int i = 0; i < keys.length; i++) {
if (keys[i].toString().startsWith("InternalFrame.")) {
System.out.println(keys[i] + " : " + javax.swing.UIManager.getDefaults().get(keys[i]));
}
}
您将找到以下键:
"InternalFrame.closeIcon"
"InternalFrame.iconifyIcon"
"InternalFrame.maximizeIcon"
"InternalFrame.minimizeIcon"
然后创建4个透明的.png图标,用于关闭,图标化,最大化/最小化。
private void setInternalFrameIcon(String uiKey, String resource) {
ImageIcon icon = new ImageIcon(getClass().getResource(resource));
UIManager.put(uiKey, close);
}
setInternalFrameIcon("InternalFrame.closeIcon", "... .png");
setInternalFrameIcon("InternalFrame.iconifyIcon", "... .png");
setInternalFrameIcon("InternalFrame.maximizeIcon", "... .png");
setInternalFrameIcon("InternalFrame.minimizeIcon", "... .png");