`
daniel_tu
  • 浏览: 185270 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设置半透明的JMenuBar

    博客分类:
  • Java
阅读更多

源作:陈思羽.
更新:龚德伟.   2008.07.20

效果图



更新的内容:
优化了paint方法,不需要每次都创建一个BufferedImage.

修正了鼠标开时时菜单项背景不会变成半透明的问题
支持菜单普通情况下和鼠标选中时两种半透明设定


修正鼠标选中菜单时,文字变成不透明

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;

/** */ /**
 * 一个支持半透明的菜单UI
 * 
 * 
@author  陈思羽,龚德伟
 * @history 2008-7-20
 * 
@see  <a href=" http://www.blogjava.net/chensiyu04/articles/201425.html ">
 *      在试牛刀(设置半透明的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);
        
// 设为透明,这样才会更新菜单低下的内容(这个请了解Opaque的作用)
        menuItem.setOpaque( false );
    }


    
public   void  paint(Graphics g, JComponent comp)  {
        
// 创建一个graphics的副本
        Graphics2D gx  =  (Graphics2D) g.create();
        
// alpha 就是透明度.值越小 透明度越大
        gx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
        
// 将控件画到半透明 的画布上
         super .paint(gx, comp);
        
// graphics使用后要销毁,这是良好习惯
        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(
0 0 , menuWidth, menuHeight);
        }
  else   {
            g.setColor(menuItem.getBackground());
            g.fillRect(
0 0 , menuWidth, menuHeight);
        }

        g.setColor(oldColor);
    }


    @Override
    
protected   void  paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text)  {
        ButtonModel model 
=  menuItem.getModel();
        
// 鼠标移动菜单时文字不透明
         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);
        }

    }


    
/** */ /**
     * 设置选中时是否透明
     * 
@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;

/** */ /**
 * 半透明的菜单测试类
 * 
 * 
@author  陈思羽,龚德伟
 * @history 2008-7-20
 * 
@see  <a href=" http://www.blogjava.net/chensiyu04/articles/201425.html "> * 在试牛刀(设置半透明的JMenuBar)<
 *      /a>
 
*/

public   class  MenuTest  {
    
public   static   void  main(String[] args)  throws  Exception  {
        
// 这样把JFrame上所有JMenuBar的外观全设置为上面两个类已经写好的,这两句必须放在JMenuBar的前面 
        
// 具体放在哪个方法里随便你 
        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( " 菜单选中时背景不透明度: " ));
        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(
" 一个支持半透明的菜单UI \r\n " );
        sbMsg.append(
" \r\n " );
        sbMsg.append(
" See Also:\r\n " );
        sbMsg.append(
" 在试牛刀(设置半透明的JMenuBar)\r\n " );
        sbMsg.append(
分享到:
评论

相关推荐

    JMenuBar简介

    ### JMenuBar简介与应用 #### 一、JMenuBar概述 `JMenuBar`是Java Swing库中的一个重要组件,它继承自`javax.swing.JComponent`类,主要用于创建水平菜单栏。其功能与AWT(Abstract Window Toolkit)中的`java.awt...

    java中jfame的使用代码JMenubar.Jmenu.JmenuItem

    然后将`JMenu`添加到`JMenuBar`,最后将`JMenuBar`设置到`JFrame`。 `JMenu`和`JMenuItem`则分别表示菜单和菜单项。`JMenuItem`可以响应用户的点击事件,通常与动作监听器(ActionListener)关联,以实现特定功能。...

    java swing-JMenuBar的使用

    JMenuBar是Swing库提供的一个菜单栏组件。它可以在图形界面中创建一个水平的菜单栏,其中包含多个菜单以及每个菜单下的菜单项。

    2022年计算机二级考试java章节辅导JMenuBar 菜单.docx

    ### 2022年计算机二级考试Java章节辅导:JMenuBar 菜单 #### 一、概述 在Java Swing图形界面开发中,菜单是非常重要的组成部分之一,它可以帮助用户更直观地操作应用程序。本篇文章将重点介绍JMenuBar的使用方法,...

    五子棋java编写的,有点残,如果有意可以改改

    private JMenuBar chessMenuBar=new JMenuBar(); private JMenu optMenu=new JMenu("操作"); private JMenuItem startMenuItem=new JMenuItem("开始"); private JMenuItem exitMenuItem=new JMenuItem("退出"); ...

    计算机外文翻译-菜单和工具栏大学论文.doc

    然后,文章详细介绍了JMenuBar类的用法,包括添加菜单项、设置菜单栏的位置等。 在Java Swing中,菜单栏是通过JMenuBar类来实现的,该类继承自JComponent类,并实现了Swing的菜单栏功能。JMenuBar类有两个主要的...

    Java swing 可通过XML配置菜单条JMenuBar的工具

    这个工具的实用性很强。我认为,重要的不是技术,而是思想。 做过Android开发的程序员都知道,Android框架中所有资源都是通过XML配置文件来管理的,很好的实现了界面与业务代码的分离,提高了可扩展性。...

    JFrame简单设置窗口,菜单,和菜单项

    ### JFrame简单设置窗口、菜单与菜单项的知识点详解 #### 一、JFrame窗口简介 在Java Swing中,`JFrame`是构建图形用户界面(GUI)的基础组件之一,主要用于创建和管理顶级容器(即主窗口)。它继承自`java.awt.Frame...

    JMenuBar Creating Tool (JMBCT)-开源

    快速简便地创建javax.swing.JMenuBar对象的工具。 使用该工具,您无需编写太多混乱的代码,只需提供一些外部源(如XML文档),即可以真正可理解的格式描述其结构。

    java记事本代码

    3. 字体设置:应用程序使用了Java的字体设置API来设置文本的字体、颜色和大小。 重要组件 1. JFrame:JFrame是Java Swing库中的一种顶层容器,用于显示应用程序的主窗口。 2. JMenuBar:JMenuBar是Java Swing库中...

    打地鼠小游戏JAVA代码.docx

    * 设置游戏背景:使用ImageIcon设置游戏背景,加载背景图片。 * 设置地鼠图片:使用ImageIcon设置地鼠图片,加载地鼠图片。 * 添加游戏菜单:使用JMenuBar和JMenu添加游戏菜单,添加新游戏和暂停菜单项。 * 实现游戏...

    java菜单栏

    通常情况下,我们将一个`JMenuBar`实例设置为窗口的菜单栏,这可以通过调用窗口的`setJMenuBar()`方法实现。例如: ```java JMenuBar menuBar = new JMenuBar(); this.setJMenuBar(menuBar); ``` #### JMenu 类 `...

    java 简单的菜单栏

    这通常涉及到JFrame、JMenuBar和JMenu等组件的使用,这些组件是Java Swing库的一部分。Swing是一个轻量级的GUI工具包,用于在Java应用程序中构建图形用户界面。 标题中的“java 简单的菜单栏”指的是在Java程序中...

    计算器科目

    计算器

    JavaGUI编程高级

    通过导入必要的包,如`java.awt.*`、`java.awt.event.*`和`javax.swing.*`,创建菜单和菜单项,然后将它们添加到`JMenuBar`中,并将`JMenuBar`添加到`JFrame`中,最后设置窗口大小并使其可见。 综上所述,JavaGUI...

    像xp一样的菜单

    7. **将JMenu添加到JMenuBar**:最后,将JMenu添加到JMenuBar,并将JMenuBar设置为JFrame的菜单栏。 ```java menuBar.add(fileMenu); menuBar.add(editMenu); JFrame frame = new JFrame("像XP一样的菜单"); frame....

    Java Swing模仿记事本菜单栏

    5. 将`JMenuBar`设置到`JFrame`的顶部,通过调用`JFrame`的`setJMenuBar()`方法。 在代码中,你可能会看到类似这样的结构: ```java JFrame frame = new JFrame("记事本"); JMenuBar menuBar = new JMenuBar(); ...

    java 菜单栏的基础演示

    JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); JMenuItem exitItem = new JMenuItem("退出"); fileMenu.add(exitItem); exitItem.addActionListener(e -&gt; System.exit(0)); // 添加...

    在跨平台Java Swing应用程序中设置Mac菜单栏和Dock

    例如,你可以创建一个`JFrame`,然后设置其`JMenuBar`属性为你的菜单栏实例: ```java JFrame frame = new JFrame("My Application"); JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); ``` 接着...

    java swing综合程序

    在"Java Swing综合程序"中,我们将深入探讨如何使用Swing组件构建一个功能丰富的用户界面,包括菜单栏(JMenuBar)、工具栏(JPopupMenu)、组合框(JComboBox)、复选框(JCheckBox)和单选按钮(JRadioButton),...

Global site tag (gtag.js) - Google Analytics