轉 載 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 出現彈出式菜單