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

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

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

    設(shè)置半透明的JMenuBar(2008.7.20);

    源作:陳思羽.
    更新:龔德偉.   2008.07.20

    效果圖



    更新的內(nèi)容:
    優(yōu)化了paint方法,不需要每次都創(chuàng)建一個(gè)BufferedImage.

    修正了鼠標(biāo)開時(shí)時(shí)菜單項(xiàng)背景不會(huì)變成半透明的問題
    支持菜單普通情況下和鼠標(biāo)選中時(shí)兩種半透明設(shè)定


    修正鼠標(biāo)選中菜單時(shí),文字變成不透明
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;

    import javax.swing.ButtonModel;
    import javax.swing.JComponent;
    import javax.swing.JMenu;
    import javax.swing.JMenuItem;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.basic.BasicMenuItemUI;

    /**
     * 一個(gè)支持半透明的菜單UI
     * 
     * 
    @author 陳思羽,龔德偉
     * @history 2008-7-20
     * 
    @see <a href="http://m.tkk7.com/chensiyu04/articles/201425.html">
     *      在試牛刀(設(shè)置半透明的JMenuBar)</a>
     
    */

    public class CustomMenuItemUI extends BasicMenuItemUI {
        
    public static ComponentUI createUI(JComponent c) {
            
    return new CustomMenuItemUI();
        }


        
    /** 菜單的透明度 */
        
    private static float alpha = 0.5f;
        
    private static float selectionAlpha = 0.8f;

        
    public static float getAlpha() {
            
    return alpha;
        }


        
    public static void setAlpha(float _alpha) {
            alpha 
    = _alpha;
        }


        @Override
        
    public void installUI(JComponent c) {
            
    super.installUI(c);
            
    //設(shè)為透明,這樣才會(huì)更新菜單低下的內(nèi)容(這個(gè)請(qǐng)了解Opaque的作用)
            menuItem.setOpaque(false);
        }


        
    public void paint(Graphics g, JComponent comp) {
            
    //創(chuàng)建一個(gè)graphics的副本
            Graphics2D gx = (Graphics2D) g.create();
            
    //alpha 就是透明度.值越小 透明度越大
            gx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
            
    //將控件畫到半透明 的畫布上
            super.paint(gx, comp);
            
    //graphics使用后要銷毀,這是良好習(xí)慣
            gx.dispose();
        }


        
    /*
         * 重寫了背景的繪制方法,不管Opaque的屬性,只按不透明方式畫菜單背景
         
    */

        @Override
        
    protected void paintBackground(Graphics g, JMenuItem menuItem, Color bgColor) {
            ButtonModel model 
    = menuItem.getModel();
            Color oldColor 
    = g.getColor();
            
    int menuWidth = menuItem.getWidth();
            
    int menuHeight = menuItem.getHeight();
            
    if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) {
                Graphics2D g2 
    = (Graphics2D) g.create(); 
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, selectionAlpha));
                g2.setColor(bgColor);
                g2.fillRect(
    00, menuWidth, menuHeight);
            }
     else {
                g.setColor(menuItem.getBackground());
                g.fillRect(
    00, menuWidth, menuHeight);
            }

            g.setColor(oldColor);
        }


        @Override
        
    protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) {
            ButtonModel model 
    = menuItem.getModel();
            
    //鼠標(biāo)移動(dòng)菜單時(shí)文字不透明
            if (model.isArmed() || model.isSelected()) {
                Graphics2D g2 
    = (Graphics2D) g.create();
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 
    1.0f));
                
    super.paintText(g2, menuItem, textRect, text);
                g2.dispose();
            }
     else {
                
    super.paintText(g, menuItem, textRect, text);
            }

        }


        
    /**
         * 設(shè)置選中時(shí)是否透明
         * 
    @param b
         
    */

        
    public static void setSelectionAlpha(float alpha) {
            selectionAlpha  
    = alpha;
        }

    }



    import javax.swing.JComponent;
    import javax.swing.JPanel;
    import javax.swing.JPopupMenu;
    import javax.swing.Popup;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.basic.BasicPopupMenuUI;

    public class CustomPopupMenuUI extends BasicPopupMenuUI 
      
    public static ComponentUI createUI(JComponent c) 
       
    return new CustomPopupMenuUI(); 
      }
     
      
    public void installUI(JComponent c) 
       
    super.installUI(c); 
       popupMenu.setOpaque(
    false); 
      }
     
      
    public Popup getPopup(JPopupMenu popup, int x, int y) 
       Popup pp 
    = super.getPopup(popup,x,y); 
       JPanel panel 
    = (JPanel)popup.getParent(); 
       panel.setOpaque(
    false); 
       
    return pp; 
      }
     
    }
     


    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSeparator;
    import javax.swing.JSlider;
    import javax.swing.JTextArea;
    import javax.swing.UIManager;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;

    /**
     * 半透明的菜單測(cè)試類
     * 
     * 
    @author 陳思羽,龔德偉
     * @history 2008-7-20
     * 
    @see <a href="http://m.tkk7.com/chensiyu04/articles/201425.html"> * 在試牛刀(設(shè)置半透明的JMenuBar)<
     *      /a>
     
    */

    public class MenuTest {
        
    public static void main(String[] args) throws Exception {
            
    //這樣把JFrame上所有JMenuBar的外觀全設(shè)置為上面兩個(gè)類已經(jīng)寫好的,這兩句必須放在JMenuBar的前面 
            
    //具體放在哪個(gè)方法里隨便你 
            UIManager.put("PopupMenuUI""CustomPopupMenuUI");//自己看API, 
            UIManager.put("MenuItemUI""CustomMenuItemUI");
            JFrame frame 
    = new JFrame();
            JMenuBar mb 
    = new JMenuBar();
            frame.setJMenuBar(mb);
            JMenu menu 
    = new JMenu("File");
            mb.add(menu);
            menu.add(
    new JMenuItem("Open"));
            menu.add(
    new JMenuItem("Save"));
            menu.add(
    new JMenuItem("Close"));
            menu.add(
    new JMenuItem("Exit"));
            menu 
    = new JMenu("Edit");
            mb.add(menu);

    //如果你把UIManager.put("PopupMenuUI","CustomPopupMenuUI"); 
    //   UIManager.put("MenuItemUI","CustomMenuItemUI");   
    // 這兩句在上面刪掉 把他們放在這里 那么只有從這往下的JMenuITem可以為透明 以上的則無效果   
            menu.add(new JMenuItem("Cut"));
            menu.add(
    new JMenuItem("Copy"));
            menu.add(
    new JMenuItem("Paste"));
            menu.add(
    new JMenuItem("Paste Special.."));
            JPanel contentPane 
    = new JPanel();
            BoxLayout layout 
    = new BoxLayout(contentPane, BoxLayout.Y_AXIS);
            contentPane.setLayout(layout);
            contentPane.add(Box.createVerticalGlue());
            JSlider alphaSlider 
    = new JSlider(JSlider.HORIZONTAL);
            contentPane.add(
    new JLabel("菜單背景不透明度:"));
            contentPane.add(alphaSlider);
            alphaSlider.addChangeListener(
    new ChangeListener() {
                
    public void stateChanged(ChangeEvent e) {
                    JSlider slider 
    = (JSlider) e.getSource();
                    
    float alpha = (1.0f * slider.getValue() / 100);
                    CustomMenuItemUI.setAlpha(alpha);
                    slider.setToolTipText(
    "不透明:" + slider.getValue());
                }

            }
    );
            contentPane.add(
    new JSeparator(JSeparator.HORIZONTAL));
            JSlider selectionAlphaSlider 
    = new JSlider(JSlider.HORIZONTAL);
            contentPane.add(
    new JLabel("菜單選中時(shí)背景不透明度:"));
            contentPane.add(selectionAlphaSlider);
            selectionAlphaSlider.addChangeListener(
    new ChangeListener() {
                
    public void stateChanged(ChangeEvent e) {
                    JSlider slider 
    = (JSlider) e.getSource();
                    
    float alpha = (1.0f * slider.getValue() / 100);
                    CustomMenuItemUI.setSelectionAlpha(alpha);
                    slider.setToolTipText(
    "不透明:" + slider.getValue());
                }

            }
    );
            contentPane.add(
    new JSeparator(JSeparator.HORIZONTAL));
            contentPane.add(Box.createVerticalGlue());
            StringBuilder sbMsg 
    = new StringBuilder();
            sbMsg.append(
    "CustomMenuItemUI\r\n");
            sbMsg.append(
    "一個(gè)支持半透明的菜單UI \r\n");
            sbMsg.append(
    "\r\n");
            sbMsg.append(
    "See Also:\r\n");
            sbMsg.append(
    "在試牛刀(設(shè)置半透明的JMenuBar)\r\n");
            sbMsg.append(
    "Author:\r\n");
            sbMsg.append(
    "陳思羽,龔德偉\r\n");
            sbMsg.append(
    "@history\r\n");
            sbMsg.append(
    "2008-7-20");
            contentPane.add(
    new JScrollPane(new JTextArea(sbMsg.toString())));
            frame.setContentPane(contentPane);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setSize(
    200200);
            frame.setLocationRelativeTo(
    null);
            frame.setVisible(
    true);
        }

    }

    posted on 2008-05-19 16:36 相信 閱讀(4338) 評(píng)論(12)  編輯  收藏 所屬分類: Swing文章

    評(píng)論

    # re: 在試牛刀(設(shè)置半透明的JMenuBar); 2008-05-19 20:05 李志偉

    寫的還不錯(cuò),值得學(xué)習(xí),這些代碼我可以用嗎?  回復(fù)  更多評(píng)論   

    # re: 在試牛刀(設(shè)置半透明的JMenuBar); 2008-05-19 20:13 相信

    當(dāng)然可以..這些你拿去自己改改吧..  回復(fù)  更多評(píng)論   

    # re: 在試牛刀(設(shè)置半透明的JMenuBar); 2008-05-19 20:45 暴風(fēng)不如雨

    頂你來了!!  回復(fù)  更多評(píng)論   

    # re: 在試牛刀(設(shè)置半透明的JMenuBar); 2008-07-20 19:54 kylixs

    //精簡(jiǎn)后的代碼
    public class CustomMenuItemUI extends BasicMenuItemUI {
    public static ComponentUI createUI(JComponent c) {
    return new CustomMenuItemUI();
    }
    @Override
    public void installUI(JComponent c) {
    super.installUI(c);
    menuItem.setOpaque(false);
    }
    public void paint(Graphics g, JComponent comp) {
    //復(fù)制一個(gè)graphics
    Graphics2D gx = (Graphics2D) g.create();
    // do an alpha composite
    //0.8f 就是透明度.值越小 透明度越大
    gx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
    //將控件畫到半透明 的畫布上
    super.paint(gx, comp);
    //graphics使用后要銷毀,這是良好習(xí)慣
    gx.dispose();
    }
    }  回復(fù)  更多評(píng)論   

    # re: 在試牛刀(設(shè)置半透明的JMenuBar); 2008-07-20 22:20 相信

    感謝kylixs的精簡(jiǎn)更新..  回復(fù)  更多評(píng)論   

    # re: 設(shè)置半透明的JMenuBar(2008.7.20); 2008-08-23 14:44 我愛你的微笑

    好!!!  回復(fù)  更多評(píng)論   

    # re: 設(shè)置半透明的JMenuBar(2008.7.20); 2009-04-28 15:12 landy

    頂你啦  回復(fù)  更多評(píng)論   

    # re: 設(shè)置半透明的JMenuBar(2008.7.20); 2009-11-03 16:44 ㄚ琪

    感謝!
    這應(yīng)該可以解UndeadJ的問題!  回復(fù)  更多評(píng)論   

    # 報(bào)錯(cuò)了!!!!!!!!!!!!!![未登錄] 2009-12-28 17:28 c

    run:
    UIDefaults.getUI() failed: no ComponentUI class for: javax.swing.JMenuItem[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=null,paintBorder=false,paintFocus=false,pressedIcon=,rolloverEnabled=false,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=Open]
    java.lang.Error
    at javax.swing.UIDefaults.getUIError(UIDefaults.java:711)
    at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:133)
    at javax.swing.UIDefaults.getUI(UIDefaults.java:741)
    at javax.swing.UIManager.getUI(UIManager.java:1016)
    at javax.swing.JMenuItem.updateUI(JMenuItem.java:232)
    at javax.swing.JMenuItem.init(JMenuItem.java:194)
    at javax.swing.JMenuItem.<init>(JMenuItem.java:133)
    at javax.swing.JMenuItem.<init>(JMenuItem.java:110)
    at customtransparencemenu.example.MenuTest.main(MenuTest.java:47)
    UIDefaults.getUI() failed: no ComponentUI class for: javax.swing.JPopupMenu[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,desiredLocationX=0,desiredLocationY=0,label=,lightWeightPopupEnabled=true,margin=,paintBorder=true]
    java.lang.Error
    at javax.swing.UIDefaults.getUIError(UIDefaults.java:711)
    at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:133)
    at javax.swing.UIDefaults.getUI(UIDefaults.java:741)
    at javax.swing.UIManager.getUI(UIManager.java:1016)
    at javax.swing.JPopupMenu.updateUI(JPopupMenu.java:207)
    at javax.swing.JPopupMenu.<init>(JPopupMenu.java:172)
    at javax.swing.JPopupMenu.<init>(JPopupMenu.java:157)
    at javax.swing.JMenu.ensurePopupMenuCreated  回復(fù)  更多評(píng)論   

    # 報(bào)錯(cuò)了!!!!!!!!!!!!!![未登錄] 2009-12-28 17:32 c

    UIManager.put("MenuItemUI", "CustomMenuItemUI");

    我覺得問題在這里,好像是要需要設(shè)置 開發(fā)人員默認(rèn)值 不知道對(duì)不對(duì)???
    如果對(duì)的話。請(qǐng)問在哪設(shè)置?  回復(fù)  更多評(píng)論   

    # re: 設(shè)置半透明的JMenuBar(2008.7.20);[未登錄] 2009-12-28 17:41 c

    解決了,哈哈 前后不到五分鐘,看來我還行。
    這樣解決的:
    String popUI = CustomMenuItemUI.class.getName();
    UIManager.put("MenuItemUI", popUI);


    我想順便問一下,你是怎么做的?是不是你配置了一個(gè) swing.properties屬性文件?還是怎么的?
      回復(fù)  更多評(píng)論   

    # re: 設(shè)置半透明的JMenuBar(2008.7.20); 2011-03-02 16:18 zzt

    為何編譯出現(xiàn)KNOWN SOURCE  回復(fù)  更多評(píng)論   

    <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    不顯示applet

    常用鏈接

    留言簿(16)

    我參與的團(tuán)隊(duì)

    隨筆檔案

    文章分類

    文章檔案

    新聞檔案

    相冊(cè)

    swingchina 專業(yè)搞Swing的網(wǎng)站

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲中文字幕无码不卡电影| 免费人成在线观看播放国产| 免费看国产成年无码AV片| 成人女人A级毛片免费软件| 亚洲欧洲免费无码| 免费一级毛片免费播放| 国产亚洲日韩在线三区| 久久精品国产亚洲AV高清热| 亚洲人成电影青青在线播放| 亚洲av无码无线在线观看| caoporn成人免费公开| 99re6热视频精品免费观看| 久久久久国产精品免费免费搜索| 四虎永久在线精品免费影视| 亚洲色婷婷六月亚洲婷婷6月| 久久亚洲熟女cc98cm| 亚洲av午夜国产精品无码中文字 | 亚洲最大av无码网址| 久久精品国产精品亚洲精品 | 免费无码AV一区二区| 中文字幕久精品免费视频| 国产免费不卡视频| 免费A级毛片无码A| 亚洲AV成人无码久久精品老人| 亚洲中文字幕乱码AV波多JI | 伊人免费在线观看| 久久久久久国产a免费观看黄色大片| 免费永久看黄在线观看app| 亚洲精品无码专区久久久| 国产成人亚洲精品| 成全视成人免费观看在线看| 97人妻无码一区二区精品免费| 亚洲AV中文无码乱人伦| 337p日本欧洲亚洲大胆色噜噜| 免费播放美女一级毛片| 51精品视频免费国产专区| 亚洲第一网站男人都懂| 亚洲国产精品美女| 久久免费香蕉视频| 国产美女做a免费视频软件| 亚洲人成网站影音先锋播放|