菜單由 Swing 中的 JMenu 類實現,可以包含多個菜單項和帶分隔符的菜單。在菜單中,菜單項由 JMenuItem 類表示,分隔符由 JSeparator 類表示。
菜單本質上是帶有關聯 JPopupMenu 的按鈕。當按下“按鈕”時,就會顯示 JPopupMenu。如果“按鈕”位於 JMenuBar 上,則該菜單爲頂層窗口。如果“按鈕”是另一個菜單項,則 JPopupMenu 就是“下拉”菜單。
JMenu類的常用方法
創建菜單常用構造方法有兩個:JMenu() 和 JMenu(String s)。第一個構造方法創建一個無文本的 JMenu 對象,第二個構造方法創建一個帶有指定文本的 JMenu 對象。JMenu 類的常用方法如表 1 所示。
例 1
菜單如果依附到 JMenuBar 對象上,則此菜單就是菜單欄中的菜單。菜單如果依附在 JPopupMenu 對象上,此菜單就是彈出式菜單。實現菜單欄和彈出式菜單的原理是一樣的,但在具體的實現方式上有一些區別。
下面編寫一個案例,使用 JMenuBar 類創建一個包含“文件”菜單和“編輯”菜單的菜單窗口。主要實現代碼如下:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class JMenuDemo1 extends JMenuBar
{
public JMenuDemo1()
{
add(createFileMenu()); //添加“文件”菜單
add(createEditMenu()); //添加“編輯”菜單
setVisible(true);
}
public static void main(String[] agrs)
{
JFrame frame=new JFrame("菜單欄");
frame.setSize(300,200);
frame.setJMenuBar(new JMenuDemo1());
frame.setVisible(true);
}
//定義“文件”菜單
private JMenu createFileMenu()
{
JMenu menu=new JMenu("文件(F)");
menu.setMnemonic(KeyEvent.VK_F); //設置快速訪問符
JMenuItem item=new JMenuItem("新建(N)",KeyEvent.VK_N);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));
menu.add(item);
item=new JMenuItem("打開(O)",KeyEvent.VK_O);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
menu.add(item);
item=new JMenuItem("保存(S)",KeyEvent.VK_S);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,ActionEvent.CTRL_MASK));
menu.add(item);
menu.addSeparator();
item=new JMenuItem("退出(E)",KeyEvent.VK_E);
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,ActionEvent.CTRL_MASK));
menu.add(item);
return menu;
}
//定義“編輯”菜單
private JMenu createEditMenu()
{
JMenu menu=new JMenu("編輯(E)");
menu.setMnemonic(KeyEvent.VK_E);
JMenuItem item=new JMenuItem("撤銷(U)",KeyEvent.VK_U);
item.setEnabled(false);
menu.add(item);
menu.addSeparator();
item=new JMenuItem("剪貼(T)",KeyEvent.VK_T);
menu.add(item);
item=new JMenuItem("複製(C)",KeyEvent.VK_C);
menu.add(item);
menu.addSeparator();
JCheckBoxMenuItem cbMenuItem=new JCheckBoxMenuItem("自動換行");
menu.add(cbMenuItem);
return menu;
}
}
上述代碼調用 JMenu 對象的 setMnemonic() 方法設置當前菜單的快速訪問符。該符號必須對應鍵盤上的一個鍵,並且應該使用 java.awt.event.KeyEvent 中定義的 VK—XXX 鍵代碼之一指定。
提示:快速訪問符是一種快捷鍵,通常在按下 Alt 鍵和某個字母時激活。例如,常用的 Alt+F 是“文件” 菜單的快速訪問符。
JMenuItem 類實現的是菜單中的菜單項。菜單項本質上是位於列表中的按鈕。當用戶單擊“按鈕”時,則執行與菜單項關聯的操作。JMenuItem 的常用構造方法有以下三個。
JMenuItem(String text):創建帶有指定文本的 JMenuItem。
JMenuItem(String text,Icon icon):創建帶有指定文本和圖標的 JMenuItem。
JMenuItem(String text,int mnemonic):創建帶有指定文本和鍵盤助記符的 JMenuItem。
在該實例中,創建菜單項後調用 JMenuItem 對象的 setAccelerator(KeyStroke) 方法來設置修改鍵,它能直接調用菜單項的操作監聽器而不必顯示菜單的層次結構。在本實例中沒有實現事件監聽機制,所以使用快捷鍵時將得不到程序的任何響應,但是在菜單項中將出現快捷鍵。
運行該實例,圖 1 所示是“文件”菜單展開效果,圖 2 所示是“編輯”菜單展開的效果。
彈出式菜單 JPopuMenu
彈出式菜單由 JPopupMenu 類實現,它是一個可彈出並顯示一系列選項的小窗口。它還用於當用戶選擇菜單項並激活它時顯示的“右拉式(pull-right)”菜單,可以在想讓菜單顯示的任何其他位置使用。例如,當用戶在指定區域中右擊時。
JPopupMenu 類的常用方法如表 2 所示。
例 2
使用 JPopupMenu 類創建一個彈出式菜單,並在菜單中使用子菜單。主要實現代碼如下:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JRadioButtonMenuItem;
public class JPopupMenuDemo extends JFrame
{
JMenu fileMenu;
JPopupMenu jPopupMenuOne;
JMenuItem openFile,closeFile,exit;
JRadioButtonMenuItem copyFile,pasteFile;
ButtonGroup buttonGroupOne;
public JPopupMenuDemo()
{
jPopupMenuOne=new JPopupMenu(); //創建jPopupMenuOne對象
buttonGroupOne=new ButtonGroup();
//創建文件菜單及子菜單,並將子菜單添加到文件菜單中
fileMenu=new JMenu("文件");
openFile=new JMenuItem("打開");
closeFile=new JMenuItem("關閉");
fileMenu.add(openFile);
fileMenu.add(closeFile);
//將fileMenu菜單添加到彈出式菜單中
jPopupMenuOne.add(fileMenu);
//添加分割符
jPopupMenuOne.addSeparator();
//創建單選菜單項,並添加到ButtonGroup對象中
copyFile=new JRadioButtonMenuItem("複製");
pasteFile=new JRadioButtonMenuItem("粘貼");
buttonGroupOne.add(copyFile);
buttonGroupOne.add(pasteFile);
//將copyFile添加到jPopupMenuOne中
jPopupMenuOne.add(copyFile);
//將pasteFile添加到jPopupMenuOne中
jPopupMenuOne.add(pasteFile);
jPopupMenuOne.addSeparator();
exit=new JMenuItem("退出");
//將exit添加到jPopupMenuOne中
jPopupMenuOne.add(exit);
//創建監聽器對象
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 JPopupMenuDemo();
}
//添加內部類,其擴展了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());
}
}
}
}
在使用彈出菜單時一定要注意層次關係和菜單的位置。程序運行後由於菜單沒有被激活所以窗口是空白的,如圖 1 所示。單擊鼠標右鍵即可查看彈出式菜單,如圖 2 所示。
謝謝觀看