弹出式菜单—JPopupMenu

弹出式菜单—JPopupMenu

JPopupMenu是一种越来越常见的菜单,本节将对JPopupMenu进行介绍,主要包括如下内容:

JPopupMenu类简介;

在NetBeans中使用JPopupMenu。
9.7.1 JPopupMenu类简介

JPopupMenu类扩展了javax.swing.JComponent,是Swing提供的一种菜单。 与其他形式菜单不同的是,JPopupMenu并不固定在菜单栏中,而是能够自由浮动。JPopupMenu具有很好的环境相关(context- sensitive)特性,每一个JPopupMenu都与相应的控件相关联,该控件被称做调用者(invoker)。

创建JPopupMenu非常简单,下面代码创建了一个JPopupMenu:

JPopupMenu myJPopupMenu=new JPopupMenu();

还可以使用JPopupMenu提供的另一个构造器创建带有标题的JPopupMenu,代码如下:

JPopupMenu titleJPopupMenu=new JPopupMenu("弹出式菜单");

与JMenu一样,开发人员可以使用add方法和insert方法向JPopupMenu中添加或者插入 JMenuItem与JComponent。JPopupMenu对添加到其中的每一个菜单项都赋予一个整数索引,并根据弹出式菜单的布局管理器调整菜单 项显示的顺序。此外,还可以使用addSeparator方法添加分隔线,并且JPopupMenu也会为该分隔线指定一个整数索引。

开发人员通过调用弹出式菜单触发器对应的show方法来显示弹出式菜单,show方法会在菜单显示之前对其location和invoker属性加以设定。

开发人员应该检查所有的MouseEvent事件,看其是否是弹出式菜单触发器,然后在合适的时候显示弹出式菜单,下面的showJPopupMenu方法在收到适当的触发器事件时就会显示弹出式菜单,代码如下:

public void showJPopupMenu(MouseEvent e){

if(e.isPopupTrigger()){

myJPopupMenu.show(invoker,e.getX(),e.getY());

}

}

多种事件都可以取消弹出事件,如单击菜单项、调整调用控件的大小、移动、关闭、最小化或者最大化父窗口等。

JPopupMenu类提供了很多方法供开发人员使用,表9-7给出了其中一些常用的方法及其说明。

表9-7 JPopupMenu类常用方法及说明
方 法
说 明

getInvoker()
返回作为此弹出菜单的“调用者”的控件

setInvoker(Component invoker)
设置弹出菜单的调用者,即弹出菜单在其中显示的控件

addPopupMenuListener(PopupMenu Listener l)
添加PopupMenu侦听器

removePopupMenuListener(PopupMenuListener l)
移除PopupMenu侦听器

getPopupMenuListeners()
返回利用addPopupMenuListener()添加到此JMenuItem的所有PopupMenuListener组成的数组

getLabel()
返回弹出菜单的标签

setLabel(String label)
设置弹出菜单的标签

show(Component invoker,int x,int y)
在调用者的坐标空间中的位置X、Y处显示弹出菜单

getComponentIndex(Component c)
返回指定控件的索引

setPopupSize(Dimension d)
使用Dimension对象设置弹出菜单的大小。此操作等效于setPreferredSize(d)

setPopupSize(int width int height)
将弹出菜单的大小设置为指定的宽度和高度。此操作等效于setPreferredSize(new Dimension(width, height))

getComponent()
返回此JPopupMenu控件

isPopupTrigger(MouseEvent e)
如果当前系统将MouseEvent视为弹出菜单触发器,则返回true

 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//左键弹出菜单
public class JPopMenuDemo extends JFrame {

       JRadioButtonMenuItem items[]; //菜单项
       Color[] colors={Color.blue,Color.pink,Color.yellow,Color.red,Color.orange}; //颜色数组
       JPopupMenu popupMenu; //弹出菜单

       public JPopMenuDemo()
      {
          super( "右键弹出菜单" ); //调用父类构造函数
          ChangeColorAction action = new ChangeColorAction(); //菜单项事件处理
          String[] str = {"Blue","Pink","Yellow","Red","Orange"}; //菜单项名称
          ButtonGroup colorGroup=new ButtonGroup(); //实例化按钮组
          popupMenu=new JPopupMenu(); //实例化弹出菜单


          items=new JRadioButtonMenuItem[5]; //初始化数组
          for (int i=0;i<items.length;i++) {
             items[i]=new JRadioButtonMenuItem(str[i]); //实例化菜单项
             popupMenu.add(items[i]); //增加菜单项到菜单上
             colorGroup.add(items[i]); //增加菜单项到按钮组
            items[i].addActionListener(action); //菜单项事件处理
          }

          addMouseListener(new MouseAdapter(){  //窗口的鼠标事件处理
                public void mousePressed( MouseEvent event ) {  //点击鼠标
                   triggerEvent(event);  //调用triggerEvent方法处理事件
                }
                public void mouseReleased( MouseEvent event ) { //释放鼠标
                   triggerEvent(event);  //只有释放才好使
                }
                private void triggerEvent(MouseEvent event) { //处理事件
                   if (event.isPopupTrigger()) //如果是弹出菜单事件(根据平台不同可能不同)
                      popupMenu.show(event.getComponent(),event.getX(),event.getY());  //显示菜单
                }
            });


         getContentPane().setBackground(Color.white); //窗口的默认背景色为白色
         setSize(230,160); //设置窗口大小
         setVisible(true); //设置窗口为可视
         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); //关闭窗口时退出程序
       }


       class ChangeColorAction implements ActionListener { //菜单项事件处理
              public void actionPerformed(ActionEvent event)   {
                 for (int i=0;i<items.length;i++)
                    if (event.getSource()==items[i]) { //判断事件来自于哪个菜单项
                       getContentPane().setBackground(colors[i]); //设置窗口背景
                       repaint(); //重绘窗口
                       return;
                 }
              }
       }

       public static void main( String args[])   {
            new JPopMenuDemo();
       }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值