- 浏览: 184485 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
为什么昵称都叫没了:
对的,我也在做微信公众平台的开发,发现一个简单的教程 http ...
微信公众平台API -
guji528:
想找一个好一点的调试器,不知eric是否OK,有空再研究一下
Eric IDE安装 -
youyang:
受教了,不得不顶。
NoSQL非关系数据库简介 -
zhongzhai:
谢谢分享,波一个
Java中的UDP协议编程 -
huwenbiao2010:
有实现JPopupMenu透明的案例不,发个给我 ,谢谢了 , ...
一道笔试题
源作:陈思羽.
更新:龚德伟. 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 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.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(
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(
发表评论
-
UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
2013-04-26 22:32 873继承 指的是一个类(称为子类、子接口)继承另外的一个类( ... -
数据库链接池(DBCP)配置参考
2012-01-31 17:20 1017链接池不但能提高数据库的访问效率,也能有效地控制自 ... -
使用svn——项目的目录布局
2011-01-07 21:12 801Subversion有一个很标准的目录结构,是这样的。 比如 ... -
Socket TCP连接和断开过程
2010-11-03 09:22 2322在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握 ... -
几个重要的TCP/IP选项解析(Java Socket)
2010-10-28 13:22 10791. SO_LINGER / SO_REUSEADDR ... -
java jvm 参数 -Xms -Xmx -Xmn -Xss 调优总结
2010-10-25 13:41 973常见配置举例 堆大 ... -
jstat,jmap,jconsole,jvisualvm,jps,jinfo等JDK系统监控、性能调优工具
2010-10-11 13:57 805JProfiler在java程序性能调试方便表现优越,推荐使用 ... -
一道笔试题
2010-09-28 23:05 1005问题说明 : 计算一个整形数组里的连续元素和的最大值 ... -
一个题目:超大量数据的排序
2010-09-22 03:40 1830一个文件里,有一堆int,把它们排序一下,输出到另外一个文 ... -
各种系统架构图及其简介
2010-03-01 11:35 2440转载请保留出处 , 不胜人生 一场醉汇总。 ... -
Java抓图软件
2010-01-19 09:52 1017以下代码不是本人所写,乃是从网上搜到,记录下来供以后参考。 ... -
16进制字符串与byte数组互转(转载)
2010-01-13 21:07 1975import java.io.ByteArrayInp ... -
byte,int,char,double的相互转换(java)
2010-01-13 21:05 2692//整数到字节数组的转换 public stat ... -
Java中的UDP协议编程
2009-11-18 14:34 1919一. UDP协议定义 UDP协议的全称是用户数据报 ... -
System.getProperties()
2009-07-26 22:26 28541 、 java 通过 System.g ... -
System.getProperty()参数大全
2009-07-26 22:22 873java.version Ja ... -
JAVA打包后读取自身JAR中的文件
2009-07-26 21:48 5690在编写完Java程序后,打包成Jar时发布,会发现找不到Jar ... -
log4j 日志文件相对路径
2009-07-26 21:32 13011、在Tomcat 5.5中的Log4j ... -
windows下openldap的安装与java操作测试
2009-07-01 15:36 921windows下openldap的安装与 ... -
用Ant编译、junit测试、生成测试报告、最终自动发mail
2009-03-19 14:15 1574测试通过的版本如下:Eclipse:3.3.2jdk:1.6j ...
相关推荐
### JMenuBar简介与应用 #### 一、JMenuBar概述 `JMenuBar`是Java Swing库中的一个重要组件,它继承自`javax.swing.JComponent`类,主要用于创建水平菜单栏。其功能与AWT(Abstract Window Toolkit)中的`java.awt...
然后将`JMenu`添加到`JMenuBar`,最后将`JMenuBar`设置到`JFrame`。 `JMenu`和`JMenuItem`则分别表示菜单和菜单项。`JMenuItem`可以响应用户的点击事件,通常与动作监听器(ActionListener)关联,以实现特定功能。...
JMenuBar是Swing库提供的一个菜单栏组件。它可以在图形界面中创建一个水平的菜单栏,其中包含多个菜单以及每个菜单下的菜单项。
### 2022年计算机二级考试Java章节辅导:JMenuBar 菜单 #### 一、概述 在Java Swing图形界面开发中,菜单是非常重要的组成部分之一,它可以帮助用户更直观地操作应用程序。本篇文章将重点介绍JMenuBar的使用方法,...
private JMenuBar chessMenuBar=new JMenuBar(); private JMenu optMenu=new JMenu("操作"); private JMenuItem startMenuItem=new JMenuItem("开始"); private JMenuItem exitMenuItem=new JMenuItem("退出"); ...
然后,文章详细介绍了JMenuBar类的用法,包括添加菜单项、设置菜单栏的位置等。 在Java Swing中,菜单栏是通过JMenuBar类来实现的,该类继承自JComponent类,并实现了Swing的菜单栏功能。JMenuBar类有两个主要的...
这个工具的实用性很强。我认为,重要的不是技术,而是思想。 做过Android开发的程序员都知道,Android框架中所有资源都是通过XML配置文件来管理的,很好的实现了界面与业务代码的分离,提高了可扩展性。...
### JFrame简单设置窗口、菜单与菜单项的知识点详解 #### 一、JFrame窗口简介 在Java Swing中,`JFrame`是构建图形用户界面(GUI)的基础组件之一,主要用于创建和管理顶级容器(即主窗口)。它继承自`java.awt.Frame...
快速简便地创建javax.swing.JMenuBar对象的工具。 使用该工具,您无需编写太多混乱的代码,只需提供一些外部源(如XML文档),即可以真正可理解的格式描述其结构。
3. 字体设置:应用程序使用了Java的字体设置API来设置文本的字体、颜色和大小。 重要组件 1. JFrame:JFrame是Java Swing库中的一种顶层容器,用于显示应用程序的主窗口。 2. JMenuBar:JMenuBar是Java Swing库中...
* 设置游戏背景:使用ImageIcon设置游戏背景,加载背景图片。 * 设置地鼠图片:使用ImageIcon设置地鼠图片,加载地鼠图片。 * 添加游戏菜单:使用JMenuBar和JMenu添加游戏菜单,添加新游戏和暂停菜单项。 * 实现游戏...
通常情况下,我们将一个`JMenuBar`实例设置为窗口的菜单栏,这可以通过调用窗口的`setJMenuBar()`方法实现。例如: ```java JMenuBar menuBar = new JMenuBar(); this.setJMenuBar(menuBar); ``` #### JMenu 类 `...
这通常涉及到JFrame、JMenuBar和JMenu等组件的使用,这些组件是Java Swing库的一部分。Swing是一个轻量级的GUI工具包,用于在Java应用程序中构建图形用户界面。 标题中的“java 简单的菜单栏”指的是在Java程序中...
计算器
通过导入必要的包,如`java.awt.*`、`java.awt.event.*`和`javax.swing.*`,创建菜单和菜单项,然后将它们添加到`JMenuBar`中,并将`JMenuBar`添加到`JFrame`中,最后设置窗口大小并使其可见。 综上所述,JavaGUI...
7. **将JMenu添加到JMenuBar**:最后,将JMenu添加到JMenuBar,并将JMenuBar设置为JFrame的菜单栏。 ```java menuBar.add(fileMenu); menuBar.add(editMenu); JFrame frame = new JFrame("像XP一样的菜单"); frame....
5. 将`JMenuBar`设置到`JFrame`的顶部,通过调用`JFrame`的`setJMenuBar()`方法。 在代码中,你可能会看到类似这样的结构: ```java JFrame frame = new JFrame("记事本"); JMenuBar menuBar = new JMenuBar(); ...
JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("文件"); JMenuItem exitItem = new JMenuItem("退出"); fileMenu.add(exitItem); exitItem.addActionListener(e -> System.exit(0)); // 添加...
例如,你可以创建一个`JFrame`,然后设置其`JMenuBar`属性为你的菜单栏实例: ```java JFrame frame = new JFrame("My Application"); JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); ``` 接着...
在"Java Swing综合程序"中,我们将深入探讨如何使用Swing组件构建一个功能丰富的用户界面,包括菜单栏(JMenuBar)、工具栏(JPopupMenu)、组合框(JComboBox)、复选框(JCheckBox)和单选按钮(JRadioButton),...