Java開發筆記(一百三十三)Swing的菜單

傳統的桌面程序基本是對某種類型的文件進行加工,例如Window自帶的記事本用來讀寫文本文件,自帶的畫圖程序用來查看和修改位圖文件。爲了方便用戶切換各類操做,這些程序在窗口頂端放了一排菜單欄,單擊菜單欄上的每一個菜單,又會在下方彈出一列菜單項,就像下圖所示的記事本菜單那樣。html


而後單擊某個菜單項,好比「新建」、「打開」、「保存」等,記事本程序便會執行相應的處理操做。
這組菜單在Swing中被分解爲三種控件,首先是頂部的一整條菜單欄,對應的控件叫JMenuBar;其次是菜單欄上的每一個菜單,對應的控件叫JMenu;再次是菜單下拉麪板中的每一個菜單項,對應的控件叫JMenuItem。三種控件的層次關係爲:菜單欄JMenuBar→菜單JMenu→菜單項JMenuItem,它們各司其職,才實現了多級菜單的分類功能。下面分別介紹這三種控件的用法。
一、菜單欄JMenuBar
菜單欄只是個框架,裏面容納了好幾個菜單按鈕,這些菜單排成一行才造成了菜單欄的模樣。調用窗口對象Frame的setJMenuBar方法,便可將菜單欄添加至窗口頂部。至於JMenuBar的經常使用方法說明以下:
add:在菜單欄上添加指定菜單。
getMenuCount:獲取菜單的數量。
getMenu:獲取指定位置的菜單。
二、菜單JMenu
菜單是菜單欄上的一個個文字按鈕,調用菜單欄對象的add方法,便可將菜單添加至菜單欄。如下是JMenu的經常使用方法說明:
setPreferredSize:設置菜單按鈕的推薦寬高。
setFont:設置菜單按鈕的字體。
add:在菜單上添加指定菜單項。
addSeparator:在菜單上添加分隔線。
getItemCount:獲取菜單項的數量。
getItem:獲取指定位置的菜單項。
三、菜單項JMenuItem
單擊菜單欄上的菜單按鈕,會在下方彈出一塊下拉麪板,面板上羅列的正是歸屬該菜單的一列菜單項。調用菜單按鈕的add方法,便可將菜單項添加至菜單。如下是JMenuItem的經常使用方法說明:
setPreferredSize:設置菜單項的推薦寬高。
setFont:設置菜單項的字體。
setActionCommand:設置菜單項的動做命令。以後才能在單擊事件的getActionCommand方法中獲取單擊來源動做命令。
addActionListener:給菜單項註冊單擊監聽器。框架

按照以上的菜單控件方法說明,接下來舉個實際案例演示整個菜單的完整用法。首先設計一個菜單欄,其上包含「文件」、「編輯」、「幫助」三個菜單按鈕,而後「文件」菜單下掛了「新建」、「打開」、「保存」、「退出」四個菜單項,「編輯」菜單下掛了「剪切」、「複製」、「粘貼」三個菜單項,「幫助」菜單下掛了「關於」一個菜單項。那麼依次建立菜單欄、三個菜單,以及個菜單項下屬的菜單項,再回頭把菜單項添加至菜單,把菜單添加至菜單欄,把菜單欄添加至窗口,如此一番操做後的菜單組建代碼示例以下:字體

		JMenuBar menuBar = new JMenuBar(); // 建立一個菜單欄
		JMenu fileMenu = new JMenu("文件"); // 建立一個菜單
		JMenu editMenu = new JMenu("編輯"); // 建立一個菜單
		JMenu helpMenu = new JMenu("幫助"); // 建立一個菜單
		// 如下建立各個菜單項,並分配每一個菜單項的動做命令
		JMenuItem newItem = new JMenuItem("新建"); // 建立一個菜單項
		newItem.setActionCommand("New"); // 設置菜單項的動做命令
		JMenuItem openItem = new JMenuItem("打開"); // 建立一個菜單項
		openItem.setActionCommand("Open"); // 設置菜單項的動做命令
		JMenuItem saveItem = new JMenuItem("保存"); // 建立一個菜單項
		saveItem.setActionCommand("Save"); // 設置菜單項的動做命令
		JMenuItem exitItem = new JMenuItem("退出"); // 建立一個菜單項
		exitItem.setActionCommand("Exit"); // 設置菜單項的動做命令
		JMenuItem cutItem = new JMenuItem("剪切"); // 建立一個菜單項
		cutItem.setActionCommand("Cut"); // 設置菜單項的動做命令
		JMenuItem copyItem = new JMenuItem("複製"); // 建立一個菜單項
		copyItem.setActionCommand("Copy"); // 設置菜單項的動做命令
		JMenuItem pasteItem = new JMenuItem("粘貼"); // 建立一個菜單項
		pasteItem.setActionCommand("Paste"); // 設置菜單項的動做命令
		JMenuItem aboutItem = new JMenuItem("關於"); // 建立一個菜單項
		aboutItem.setActionCommand("About"); // 設置菜單項的動做命令
		// 如下把每一個菜單項添加到對應的菜單上
		fileMenu.add(newItem); // 在菜單上添加菜單項
		fileMenu.add(openItem); // 在菜單上添加菜單項
		fileMenu.add(saveItem); // 在菜單上添加菜單項
		fileMenu.addSeparator(); // 在菜單上添加分隔線
		fileMenu.add(exitItem); // 在菜單上添加菜單項
		editMenu.add(copyItem); // 在菜單上添加菜單項
		editMenu.add(pasteItem); // 在菜單上添加菜單項
		helpMenu.add(aboutItem); // 在菜單上添加菜單項
		// 如下把每一個菜單都添加到菜單欄上
		menuBar.add(fileMenu); // 在菜單欄上添加菜單
		menuBar.add(editMenu); // 在菜單欄上添加菜單
		menuBar.add(helpMenu); // 在菜單欄上添加菜單
		frame.setJMenuBar(menuBar); // 在窗口上添加菜單欄
		setMenuAction(menuBar, font); // // 設置菜單項的外觀及其動做事件

 

但是上面的代碼僅僅完成菜單層級的構建,既沒有定製菜單的外觀,也沒法響應菜單項的單擊事件。爲此還得編寫單獨的setMenuAction方法,在該方法中逐個設置每一個菜單按鈕、菜單項的尺寸與字體,同時給每一個菜單項註冊單擊事件,這樣在用戶選擇某個菜單項以後,程序才能獲知是哪一個菜單項被選中了。setMenuAction方法的定義代碼以下所示:spa

	// 設置菜單項的外觀及其動做事件
	private static void setMenuAction(JMenuBar bar, Font font) {
		for (int i = 0; i < bar.getMenuCount(); i++) { // 遍歷菜單欄下的全部菜單
			JMenu menu = bar.getMenu(i); // 獲取指定位置的菜單
			menu.setFont(font); // 設置菜單按鈕的文本字體
			menu.setPreferredSize(new Dimension(60, 30)); // 設置菜單按鈕的推薦寬高
			for (int j = 0; j < menu.getItemCount(); j++) { // 遍歷菜單下的全部菜單項
				JMenuItem item = menu.getItem(j); // 獲取指定位置的菜單項
				if (item != null) { // 菜單項非空。這個判斷是爲了避開菜單項之間的分隔線
					item.setFont(font); // 設置菜單項的文本字體
					item.setPreferredSize(new Dimension(120, 28)); // 設置菜單項的推薦寬高
					item.addActionListener(new ActionListener() { // 給菜單項註冊單擊監聽器
						public void actionPerformed(ActionEvent e) { // 發生了單擊事件
							// 調用getActionCommand方法獲取單擊事件的動做命令,並展現在標籤上
							label.setText("您點擊了菜單項:" + e.getActionCommand());
						}
					});
				}
			}
		}
	}

 

接着運行編寫好的菜單操做代碼,彈出以下圖所示的窗口界面。設計


在該窗口上單擊「文件」菜單,在菜單下方彈出歸屬文件菜單的面板,詳細界面以下圖所示。3d


單擊菜單面板上的「新建」菜單項,觀察發現菜單面板消失不見,此時窗口主界面上的標籤控件展現了單擊事件的動做描述,下圖即是此刻的窗口界面。orm

 



更多Java技術文章參見《Java開發筆記(序)章節目錄htm

相關文章
相關標籤/搜索