何以解憂?唯有Java

          其實(shí)程序員也懂得浪漫!
          posts - 90, comments - 637, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
              Swing應(yīng)用程序如果是在開源的Look&&Feel 之間切換,感覺很容易,但是如果 把應(yīng)用程序在開源外觀下切換到系統(tǒng)默認(rèn)的或者JDK自帶的外觀時(shí),問題就來了。 不是沒有標(biāo)題欄,就是標(biāo)題欄的外觀沒有改變,用的是系統(tǒng)的窗口裝飾。這些是因?yàn)樵趹?yīng)用程序啟動時(shí)在main方法里添加了這樣一句代碼造成的:
             
          JFrame.setDefaultLookAndFeelDecorated(true);

          目前解決這個(gè)問題的辦法就是先將 原來的JFrame dispose掉 ,然后在new一個(gè) JFrame ,讓原來的frame 指向這個(gè)新的JFrame。不多說,看代碼比較直觀, 核心代碼如下:

              初始化應(yīng)用,initComponents()方法是NetBeans IDE生成的,就不貼了。

            

              private static JFrame config;
              
          private Rectangle savedBounds;



              
          /** Creates new form Config */
              
          public SkinChangeDemo() {
                  initComponents();
              }

              
          public SkinChangeDemo(boolean decor) {
                  setUndecorated(decor);
                  initComponents();
              }


          下面就是核心代碼:

           private void saharaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
                  
          // TODO add your handling code here:
                  LookAndFeel old = UIManager.getLookAndFeel();
                  SubstanceSkin skin 
          = new SaharaSkin();
                  
          if (old instanceof SubstanceLookAndFeel) {
                      SubstanceLookAndFeel.setSkin(skin);
                  } 
          else {   //如果不是Substance的外觀則切換為Substance外觀
                          changSkin(skin);
                  }
              }                                            

              
          private void nimbusButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
                  
          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);

              }                                            

              
          private void businessButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
                  LookAndFeel old 
          = UIManager.getLookAndFeel();
                  SubstanceSkin skin 
          = new BusinessSkin();
                  
          if (old instanceof SubstanceLookAndFeel) {
                      SubstanceLookAndFeel.setSkin(skin);
                  } 
          else {    //如果不是Substance的外觀則切換為Substance外觀
                      changSkin(skin);
                  }
              }                                              

              
          /**
               *用于將非Substance 外觀的界面該為Substance外觀。
               * 
          @param skin
               
          */
              
          private void changSkin(SubstanceSkin skin) {
                  savedBounds 
          = getBounds();
                  dispose();
                  config 
          = new SkinChangeDemo(true);
                  config.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);  
          //這句是關(guān)鍵代碼,自己看API體會吧
                  config.setBounds(savedBounds);  //保持變換皮膚時(shí)位置不變
                  SubstanceLookAndFeel.setSkin(skin);
                  config.setVisible(
          true);
                  config.getRootPane().updateUI();
                  SwingUtilities.updateComponentTreeUI(
          this);

              }

          main方法:
           public static void main(String args[]) {

                  JFrame.setDefaultLookAndFeelDecorated(
          true);
                  JDialog.setDefaultLookAndFeelDecorated(
          true);
                  
          try {
                      
          //新建一個(gè)圖片水印,路徑可以自己該,使用自己喜歡的圖片來做應(yīng)用程序的水印圖片、
                      SubstanceImageWatermark watermark = new SubstanceImageWatermark(SkinChangeDemo.class.getResourceAsStream("/demo/031be.jpg"));
                      watermark.setKind(ImageWatermarkKind.APP_CENTER);
                      watermark.setOpacity((
          float0.7);
                      UIManager.setLookAndFeel(
          new SubstanceOfficeBlue2007LookAndFeel());
                      SubstanceSkin skin 
          = new OfficeBlue2007Skin().withWatermark(watermark);

                      SubstanceLookAndFeel.setSkin(skin);

                  } 
          catch (UnsupportedLookAndFeelException ex) {
                      Logger.getLogger(SkinChangeDemo.
          class.getName()).log(Level.SEVERE, null, ex);
                  }
                  java.awt.EventQueue.invokeLater(
          new Runnable() {

                      
          public void run() {
                          config 
          = new SkinChangeDemo();
                          config.setVisible(
          true);
                          config.setLocationRelativeTo(
          null);
                      }
                  });
              }

          點(diǎn)擊不同的按鈕呈現(xiàn)不同的外觀,JDK里的和開源的外觀之間切換。



           沒水印的效果圖:






          BTW: 這篇文章里的內(nèi)容,正好可以回答http://www.javaeye.com/topic/400574?page=1   這個(gè)帖子中樓主的問題。

                如果有大家有什么更好的   方法,請大家不吝賜教!

               源代碼以上傳,有需要的自己下載:Demo3



          評論

          # re: Swing 本地外觀與Substance外觀之間的切換問題及解決方案  回復(fù)  更多評論   

          2009-06-09 22:13 by zht
          很不錯(cuò)

          # re: Swing 本地外觀與Substance外觀之間的切換問題及解決方案  回復(fù)  更多評論   

          2009-06-10 10:09 by 找個(gè)美女做老婆
          Swing,我覺得現(xiàn)在已經(jīng)不太流行了
          我的blog搬家了 http://www.javaly.cn
          Java樂園, Java開發(fā)人員的樂園,創(chuàng)業(yè)者的樂園 ,群號:15651281

          # re: Swing 本地外觀與Substance外觀之間的切換問題及解決方案  回復(fù)  更多評論   

          2011-09-29 09:16 by tbw
          不錯(cuò)
          主站蜘蛛池模板: 天津市| 南雄市| 贵州省| 襄城县| 崇义县| 通州市| 迭部县| 蒙阴县| 贵定县| 木兰县| 乃东县| 关岭| 桐乡市| 柘城县| 南澳县| 全南县| 峨眉山市| 彭山县| 开阳县| 汉寿县| 寿光市| 襄樊市| 凌源市| 丰台区| 四子王旗| 乡宁县| 馆陶县| 麟游县| 光山县| 虎林市| 紫云| 南城县| 军事| 临海市| 昌都县| 宁夏| 社旗县| 榆中县| 肃南| 周宁县| 庆云县|