Swing动态切换Look And Feel
这是最完整、最完美的解决方法
public static void setLookAndFeel(LookAndFeel lookAndFeel, java.util.List<Component> components){
if(components == null || components.isEmpty()) return;
try {
for(int i = 0 ; i < components.size() ; i++) {
Component c = components.get(i);
if(i == 0) {
//改变全局设置
JFrame.setDefaultLookAndFeelDecorated(lookAndFeel.getSupportsWindowDecorations());
JDialog.setDefaultLookAndFeelDecorated(lookAndFeel.getSupportsWindowDecorations());
UIManager.setLookAndFeel(lookAndFeel);
}
if (c instanceof JFrame) {
JFrame frame = (JFrame) c;
boolean isVisible = frame.isVisible();
frame.dispose();
frame.setUndecorated(lookAndFeel.getSupportsWindowDecorations());
frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
if(isVisible)frame.setVisible(true);
} else if (c instanceof JDialog) {
JDialog dialog = (JDialog) c;
boolean isVisible = dialog.isVisible();
dialog.dispose();
dialog.setUndecorated(lookAndFeel.getSupportsWindowDecorations());
dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
if(isVisible)dialog.setVisible(true);
}
if(c != null) SwingUtilities.updateComponentTreeUI(c);
}
}catch(Exception ex){
throw new RuntimeException(ex);
}
}