package test.common; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Locale; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JRootPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UIManager.LookAndFeelInfo; public class LookAndFeelSwitcher { static class LookAndFeelInfoObj { LookAndFeelInfo lafInfo; String displayName; public LookAndFeelInfoObj(LookAndFeelInfo lafInfo, String displayName) { this.lafInfo = lafInfo; this.displayName = displayName; } @Override public String toString() { return displayName; } } public interface LocaleCallback { public void onLocaleSelected(Locale selected); } public static JComboBox getLookAndFeelSwitcher(final JFrame frame) { LookAndFeelInfo[] lafs = UIManager.getInstalledLookAndFeels(); LookAndFeelInfoObj[] lafObjs = new LookAndFeelInfoObj[lafs.length]; for (int i = 0; i < lafs.length; i++) { lafObjs[i] = new LookAndFeelInfoObj(lafs[i], lafs[i].getName()); } final JComboBox result = new JComboBox(lafObjs); for (int i = 0; i < lafs.length; i++) { if (lafs[i].getName().equals(UIManager.getLookAndFeel().getName())) { result.setSelectedIndex(i); break; } } result.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { boolean wasDecoratedByOS = !frame.isUndecorated(); try { LookAndFeelInfoObj selected = (LookAndFeelInfoObj) result .getSelectedItem(); UIManager.setLookAndFeel(selected.lafInfo .getClassName()); SwingUtilities.updateComponentTreeUI(frame); } catch (Exception exc) { exc.printStackTrace(); } boolean canBeDecoratedByLAF = UIManager .getLookAndFeel() .getSupportsWindowDecorations(); if (canBeDecoratedByLAF == wasDecoratedByOS) { boolean wasVisible = frame.isVisible(); frame.setVisible(false); frame.dispose(); if (!canBeDecoratedByLAF) { // see the java docs under the method // JFrame.setDefaultLookAndFeelDecorated(boolean // value) for description of these 2 lines: frame.setUndecorated(false); frame.getRootPane().setWindowDecorationStyle( JRootPane.NONE); } else { frame.setUndecorated(true); frame.getRootPane().setWindowDecorationStyle( JRootPane.FRAME); } frame.setVisible(wasVisible); wasDecoratedByOS = !frame.isUndecorated(); } } }); } }); return result; } }