本文将通过实例介绍如何用鼠标右键启动弹出式菜单以及如何执行菜单的 指令 大家对弹出式菜单(Popup Menu)的使用相信都非常熟悉了 我们将通过如下的例子解释如何在Java中使用右键和弹出式菜单主程序是一个Java Application 叫UseRightButton它上面是一个JPanel在此JPanel上有一个JLabel用以显示弹出式菜单 中指令执行的结果我们要求当用鼠标右键点击JLabel或者JPanel上时弹出一个菜单菜单 中有Say HelloSay Hello againSay Byebye三个选项选择其中的任何一个指令将在 JLabel中显示对应的String 在本例中有两个Class一个是UseRightButton (Java应用程序)另一个是MyPopupMenu (弹出式窗口)UseRightButton的源程序如下 import javaxswing*;import javaawteventMouseEvent;import javaawteventMouseListener;import javaawt*;public class UseRightButton extends JFrame implements MouseListener{ JPanel panel; JLabel display; public UseRightButton() { setTitle(Use right button and popup menu); setSize(); panel = new JPanel(); display = new JLabel( ); displaysetOpaque(true); displaysetBackground(Coloryellow); paneladd(display); paneladdMouseListener(this); displayaddMouseListener(this); getContentPane()setLayout(new BorderLayout()); getContentPane()add(panel BorderLayoutCENTER); } public static void main(String[] args) { UseRightButton rb = new UseRightButton(); rbsetVisible(true); } public void mousePressed(MouseEvent e) { if (egetSource() == panel && egetButton() == MouseEventBUTTON) { MyPopupMenu popup = new MyPopupMenu(this); popupshow((Component)panel egetX() egetY()); } else if (egetSource() == display && egetButton() == MouseEventBUTTON) { MyPopupMenu popup = new MyPopupMenu(this); popupshow((Component)display egetX() egetY()); } } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void mouseReleased(MouseEvent e){}} 从上面的程序我们看到 和使用鼠标左键一样我们是用 来控制鼠标事件我们所要做的是限制 MouseEvent 响应鼠标右键的点击不响应鼠标左键的点击这可由下面的方法来实现 egetButton() == MouseEventBUTTON 其中 getButton() 方法返回一个整数 MouseEventBUTTON MouseEventBUTTON 或者 MouseEventBUTTON MouseEventBUTTON 代表左键 MouseEventBUTTON 代表右键如果你的鼠标有三个 键的话MouseEventBUTTON 代表中间的键 JLabel (display)仅仅占据 JPanel 的一小部分(我们用黄色背景显示它的大小和位置) 而我们要求当右键电击JPanel包括JLabel都要弹出菜单所以我们把JPanel和 JLabel都加上MouseListener 弹出式菜单Class的源程序如下 import javaxswing*;import javaawteventActionListener;import javaawteventActionEvent;public class MyPopupMenu extends JPopupMenu implements ActionListener{ JMenuItem sayHello sayHelloAgain sayByeBye; UseRightButton useRightButton; public MyPopupMenu(UseRightButton urb) { useRightButton = urb; sayHello = new JMenuItem(Say Hello); sayHelloAgain = new JMenuItem(Say Hello again); sayByeBye = new JMenuItem(Say Bye Bye); sayHelloaddActionListener(this); sayHelloAgainaddActionListener(this); sayByeByeaddActionListener(this); add(sayHello); thisaddSeparator(); add(sayHelloAgain); add(sayByeBye); } public void actionPerformed(ActionEvent e) { if (egetSource() == sayHello) { Systemoutprintln(); useRightButtondisplaysetText(Hello!); } else if (egetSource() == sayHelloAgain) { Systemoutprintln(Hello! Hello!); useRightButtondisplaysetText(Hello! Hello!); } else if (egetSource() == sayByeBye) { Systemoutprintln(Bye Bye!); useRightButtondisplaysetText(Bye Bye!); } }} 这个程序很简单是一个标准的JPopupMenu唯一需要指出的是在 constructor中我们引入该弹出式菜单的 base 类UseRightButton 这是因为 我们要返回弹出式窗口中指令执行的结果到原来的GUI界面上很显然我们 不能用 useRightButton = new UseRightButton()因为两个class不能互相引用 对于一个复杂的应用程序我们应该使用ModelViewController架构来作即 用弹出式菜单当controller用JLabel (display)作为View 再写一个model类来接 收来自弹出式菜单的String并自动更新JLabel中的显示 从以上的例子我们看到利用鼠标右键来启动弹出式菜单是非常容易的 |