import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.LookAndFeel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.DefaultTableModel; import org.pushingpixels.substance.api.SubstanceLookAndFeel; import org.pushingpixels.substance.api.SubstanceSkin; import org.pushingpixels.substance.api.skin.BusinessSkin; import org.pushingpixels.substance.api.skin.SaharaSkin; import twaver.TWaverUtil; import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel; public class SkinChangeDemo extends JFrame { private JMenuBar mainBar = new JMenuBar(); private JMenu sysMenu = new JMenu("系统"); private JMenuItem exitItem = new JMenuItem("退出"); private JMenuItem loginItem = new JMenuItem("登陆"); private JMenu aboutMenu = new JMenu("关于"); private JMenuItem helpItem = new JMenuItem("帮助"); private JPopupMenu popup = new JPopupMenu(); private JMenuItem sendItem = new JMenuItem("发信息"); private JMenuItem infoItem = new JMenuItem("看账户"); private JMenuItem logoutItem = new JMenuItem("注销"); private JTable table; private JScrollPane jspLogin; private JScrollPane jsplogTA; private JPanel displayPanel; private JPanel btnPanel; private JButton saharaButton; private JButton nimbusButton; private JButton businessButton; public static DefaultTableModel defaultModel; public static JTextArea logTA; private static JFrame config; private Rectangle savedBounds; public SkinChangeDemo() { super("皮肤测试"); initComponents(); } private void initComponents() { setMainBar(); setPanel(); initFrame(600, 450); } private void initFrame(int frameWidth, int frameHeight) { setTitle("皮肤测试"); Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenDimension = tk.getScreenSize(); int screenWidth = screenDimension.width; int screenHeight = screenDimension.height; setLocation((screenWidth - frameWidth) / 2, (screenHeight - frameHeight) / 2); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(frameWidth, frameHeight); setVisible(true); } private void setMainBar() { setJMenuBar(mainBar); mainBar.add(sysMenu); mainBar.add(aboutMenu); sysMenu.add(loginItem); sysMenu.addSeparator(); sysMenu.add(exitItem); aboutMenu.add(helpItem); popup.add(sendItem); popup.add(infoItem); popup.add(logoutItem); } private void setPanel() { String[][] playerInfo = new String[0][0]; String[] names = { "用户", "登陆时间", "当前状态" }; defaultModel = new DefaultTableModel(playerInfo, names); logTA = new JTextArea(); logTA.setLineWrap(true); jsplogTA = new JScrollPane(logTA); table = new JTable(defaultModel); jspLogin = new JScrollPane(table); displayPanel = new JPanel(); btnPanel = new JPanel(); displayPanel.setLayout(new BorderLayout()); displayPanel.add(jsplogTA, BorderLayout.CENTER); displayPanel.add(btnPanel, BorderLayout.SOUTH); saharaButton = new JButton("显示10条"); saharaButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LookAndFeel old = UIManager.getLookAndFeel(); SubstanceSkin skin = new SaharaSkin(); if (old instanceof SubstanceLookAndFeel) { SubstanceLookAndFeel.setSkin(skin); } else {// 如果不是Substance的外观则切换为Substance外观 changSkin(skin); } } }); nimbusButton = new JButton("向前10条"); nimbusButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { UIManager.setLookAndFeel(new NimbusLookAndFeel()); savedBounds = getBounds(); dispose(); config = null; config = new SkinChangeDemo(false); config.setBounds(savedBounds); config.setVisible(true); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(SkinChangeDemo.class.getName()).log(Level.SEVERE, null, ex); } //SwingUtilities.updateComponentTreeUI(this); } }); businessButton = new JButton("向后10条"); btnPanel.add(saharaButton); btnPanel.add(nimbusButton); btnPanel.add(businessButton); businessButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { LookAndFeel old = UIManager.getLookAndFeel(); SubstanceSkin skin = new BusinessSkin(); if (old instanceof SubstanceLookAndFeel) { SubstanceLookAndFeel.setSkin(skin); } else {// 如果不是Substance的外观则切换为Substance外观 changSkin(skin); } } }); jspLogin.setPreferredSize(new Dimension(600, 69)); add(jspLogin, BorderLayout.NORTH); add(displayPanel, BorderLayout.CENTER); } public SkinChangeDemo(boolean decor) { setUndecorated(decor); initComponents(); } /** * *用于将非Substance 外观的界面该为Substance外观。 * * * @param skin */ public void changSkin(SubstanceSkin skin) { savedBounds = getBounds(); dispose(); config = new SkinChangeDemo(true); config.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); // 这句是关键代码,自己看API体会吧 config.setBounds(savedBounds); // 保持变换皮肤时位置不变 SubstanceLookAndFeel.setSkin(skin); config.setVisible(true); config.getRootPane().updateUI(); SwingUtilities.updateComponentTreeUI(this); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SkinChangeDemo skinDemo = new SkinChangeDemo(); skinDemo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); TWaverUtil.centerWindow(skinDemo); } }); } }