<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    何以解憂?唯有Java

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

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

        初始化應用,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);  
    //這句是關鍵代碼,自己看API體會吧
            config.setBounds(savedBounds);  //保持變換皮膚時位置不變
            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 {
                
    //新建一個圖片水印,路徑可以自己該,使用自己喜歡的圖片來做應用程序的水印圖片、
                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);
                }
            });
        }

    點擊不同的按鈕呈現不同的外觀,JDK里的和開源的外觀之間切換。



     沒水印的效果圖:






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

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

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



    評論

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

    2009-06-09 22:13 by zht
    很不錯

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

    2009-06-10 10:09 by 找個美女做老婆
    Swing,我覺得現在已經不太流行了
    我的blog搬家了 http://www.javaly.cn
    Java樂園, Java開發人員的樂園,創業者的樂園 ,群號:15651281

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

    2011-09-29 09:16 by tbw
    不錯
    主站蜘蛛池模板: 中文字幕视频免费在线观看| 亚洲一区二区三区久久| 黄色a三级三级三级免费看| 免费无码又爽又刺激毛片| 亚洲欧美aⅴ在线资源| 嫩草影院免费观看| 亚洲国产精品无码久久九九大片| 国产成人免费爽爽爽视频| 亚洲二区在线视频| 国产在线a免费观看| 亚洲色少妇熟女11p| 免费国产综合视频在线看| 特级无码毛片免费视频| 亚洲国产午夜中文字幕精品黄网站 | 69成人免费视频| 亚洲首页国产精品丝袜| 四虎永久在线精品免费网址| 亚洲偷自拍另类图片二区| 啊灬啊灬别停啊灬用力啊免费看| 色网站在线免费观看| 亚洲区小说区激情区图片区| 久久青草国产免费观看| 亚洲一区二区影视| 又粗又硬又大又爽免费视频播放| 亚洲精品视频免费| 老色鬼久久亚洲AV综合| 免费A级毛片无码免费视| 国产亚洲视频在线观看| 亚洲中文字幕久久精品无码喷水| 99精品视频免费观看| 午夜在线a亚洲v天堂网2019| 国产又粗又长又硬免费视频| 一级看片免费视频囗交| 亚洲AV乱码久久精品蜜桃 | 免费精品国偷自产在线在线| 色欲aⅴ亚洲情无码AV| 国产V亚洲V天堂无码| 免费毛片在线看片免费丝瓜视频| 无人视频在线观看免费播放影院| 日本亚洲成高清一区二区三区| 无码人妻精品中文字幕免费东京热|