JPopupMenu类简介

本文介绍 Java Swing 中 JPopupMenu 的使用方法,包括创建、添加菜单项、显示及事件处理等。通过示例展示了如何创建一个简单的弹出菜单。

 

转     载 http://hi.baidu.com/hpc_pig/blog/item/4b3c38acdd3d610e4a36d6c6.html/cmtid/ecd09e2a85097ff7e6cd4080

 

 

 

 

 

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

下面给出了一个使用JPopupMenu的简单例子,示例代码如下:

package org.netbeans.swing.menu;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class DemoJPopupMenu extends JFrame {

JMenu fileMenu;

JPopupMenu jPopupMenuOne;

JMenuItem openFile,closeFile,exit;

JRadioButtonMenuItem copyFile,pasteFile;

ButtonGroup buttonGroupOne;

public DemoJPopupMenu(){

   jPopupMenuOne = new JPopupMenu();//创建jPopupMenuOne对象

   buttonGroupOne=new ButtonGroup();

   //创建文件菜单及子菜单,并将子菜单添加到文件菜单中

   fileMenu =new JMenu("文件");

   openFile=new JMenuItem("打开");

    closeFile=new JMenuItem("关闭");

    fileMenu.add(openFile);

    fileMenu.add( closeFile);   

    jPopupMenuOne.add(fileMenu);//将fileMenu菜单添加到弹出式菜单中

    jPopupMenuOne.addSeparator();//添加分割符

    //创建单选菜单项,并添加到ButtonGroup对象中       

   copyFile=new JRadioButtonMenuItem("复制");

   pasteFile=new JRadioButtonMenuItem("粘贴");

   buttonGroupOne.add(copyFile);

   buttonGroupOne.add(pasteFile);

    jPopupMenuOne.add(copyFile);//将copyFile添加到jPopupMenuOne中

    jPopupMenuOne.add(pasteFile);//将pasteFile添加到jPopupMenuOne中

    jPopupMenuOne.addSeparator();

    exit=new JMenuItem("退出");

    jPopupMenuOne.add(exit);//将exit添加到jPopupMenuOne中

    //创建监听器对象

    MouseListener popupListener = new PopupListener(jPopupMenuOne);

    this.addMouseListener(popupListener);//向主窗口注册监听器  

    this.setTitle("弹出式菜单的简单使用");

    this.setBounds(100,100,250,150);

    this.setVisible(true);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

    public static void main(String args[]){

     new DemoJPopupMenu();

}

    //添加内部类,其扩展了MouseAdapter类,用来处理鼠标事件

    class PopupListener extends MouseAdapter {

           JPopupMenu popupMenu;

           PopupListener(JPopupMenu popupMenu) {

               this.popupMenu = popupMenu;

           }

           public void mousePressed(MouseEvent e) {

                 showPopupMenu(e);

           }

           public void mouseReleased(MouseEvent e) {

                 showPopupMenu(e);

           }

           private void showPopupMenu(MouseEvent e) {

                if (e.isPopupTrigger()) {//如果当前事件与鼠标事件相关,则弹出菜单

                       popupMenu.show(e.getComponent(),e.getX(), e.getY());

                }结束if

           }//结束showPopupMenu

     } //结束内部类PopupListener

}//结束DemoJPopupMenu

编译并运行程序,界面如图9-18所示。在窗口中单击鼠标右键,界面如图9-19所示。

               

                图9-18 程序运行界面                    图9-19 出现弹出式菜单

 

在 Java Swing 中,`JPopupMenu` 是一个用于创建弹出式菜单的,允许用户通过点击某个组件(如鼠标右键点击)触发菜单的显示。它能够显示一系列选项,并支持在任意指定的位置弹出菜单[^1]。 ### 创建 JPopupMenu 实例 创建一个 `JPopupMenu` 实例非常简单,可以直接使用默认构造函数: ```java JPopupMenu popupMenu = new JPopupMenu(); ``` ### 添加菜单项 可以通过 `add(JMenuItem menuItem)` 方法向 `JPopupMenu` 添加菜单项。这些菜单项可以是 `JMenuItem`、`JCheckBoxMenuItem` 或 `JRadioButtonMenuItem` 等型。 ```java JMenuItem item1 = new JMenuItem("选项 1"); JMenuItem item2 = new JMenuItem("选项 2"); popupMenu.add(item1); popupMenu.add(item2); ``` ### 显示弹出菜单 使用 `show(Component invoker, int x, int y)` 方法可以在指定组件的坐标位置显示弹出菜单。通常情况下,这个方法会在某个组件的鼠标事件中被调用。 ```java popupMenu.show(invokerComponent, x, y); ``` 其中,`invokerComponent` 是触发弹出菜单的组件,`x` 和 `y` 是组件坐标空间中的位置。 ### 设置调用者组件 可以通过 `setInvoker(Component invoker)` 方法设置弹出菜单的调用者组件,这有助于在复杂的 UI 中管理菜单的显示位置[^2]。 ```java popupMenu.setInvoker(invokerComponent); ``` ### 监听弹出菜单事件 通过 `addPopupMenuListener(PopupMenuListener listener)` 方法,可以为弹出菜单添加监听器,用于监听菜单的显示和隐藏事件。 ```java popupMenu.addPopupMenuListener(new PopupMenuListener() { public void popupMenuWillBecomeVisible(PopupMenuEvent e) { // 菜单即将显示 } public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { // 菜单即将隐藏 } public void popupMenuCanceled(PopupMenuEvent e) { // 菜单被取消 } }); ``` ### 嵌套支持 `JPopupMenu` 提供了嵌套来增强功能,例如 `JPopupMenu.AccessibleJPopupMenu` 用于实现可访问性支持,`JPopupMenu.Separator` 用于添加菜单分隔符[^3]。 ### 示例代码:完整的弹出菜单实现 以下是一个完整的示例,展示如何在鼠标右键点击时显示 `JPopupMenu`: ```java import javax.swing.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class PopupMenuExample { public static void main(String[] args) { JFrame frame = new JFrame("JPopupMenu 示例"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); // 创建弹出菜单 JPopupMenu popupMenu = new JPopupMenu(); JMenuItem item1 = new JMenuItem("选项 1"); JMenuItem item2 = new JMenuItem("选项 2"); popupMenu.add(item1); popupMenu.add(item2); // 添加鼠标监听器,在右键点击时显示弹出菜单 frame.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } }); frame.setVisible(true); } } ``` ### 总结 `JPopupMenu` 提供了丰富的 API 来创建和管理弹出式菜单,支持动态添加菜单项、监听菜单事件以及自定义显示位置。结合鼠标事件,可以轻松实现右键菜单等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值