Java-GUI編程之菜單組件
前面講解了如果構建GUI介面,其實就是把一些GUI的組件,按照一定的布局放入到容器中展示就可以了。在實際開發中,除了主介面,還有一類比較重要的內容就是菜單相關組件,可以通過菜單相關組件很方便的使用特定的功能,在AWT中,菜單相關組件的使用和之前學習的組件是一模一樣的,只需要把菜單條、菜單、菜單項組合到一起,按照一定的布局,放入到容器中即可。

下表中給出常見的菜單相關組件:
菜單組件名稱 | 功能 |
---|---|
MenuBar | 菜單條 , 菜單的容器 。 |
Menu | 菜單組件 , 菜單項的容器 。 它也是Menultem的子類 ,所以可作為菜單項使用 |
PopupMenu | 上下文菜單組件(右鍵菜單組件) |
Menultem | 菜單項組件 。 |
CheckboxMenuItem | 複選框菜單項組件 |
下圖是常見菜單相關組件集成體系圖:

菜單相關組件使用:
1.準備菜單項組件,這些組件可以是MenuItem及其子類對象
2.準備菜單組件Menu或者PopupMenu(右擊彈出子菜單),把第一步中準備好的菜單項組件添加進來;
3.準備菜單條組件MenuBar,把第二步中準備好的菜單組件Menu添加進來;
4.把第三步中準備好的菜單條組件添加到窗口對象中顯示。
小技巧:
1.如果要在某個菜單的菜單項之間添加分割線,那麼只需要調用Menu的add(new MenuItem(-))即可。
2.如果要給某個菜單項關聯快捷鍵功能,那麼只需要在創建菜單項對象時設置即可,例如給菜單項關聯 ctrl+shif+/ 快捷鍵,只需要:new MenuItem(“菜單項名字”,new MenuShortcut(KeyEvent.VK_Q,true);
案例1:
使用awt中常用菜單組件,完成下圖效果

演示程式碼1:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleMenu {
//創建窗口
private Frame frame = new Frame("這裡測試菜單相關組件");
//創建菜單條組件
private MenuBar menuBar = new MenuBar();
//創建文件菜單組件
private Menu fileMenu = new Menu("文件");
//創建編輯菜單組件
private Menu editMenu = new Menu("編輯");
//創建新建菜單項
private MenuItem newItem = new MenuItem("新建");
//創建保存菜單項
private MenuItem saveItem = new MenuItem("保存");
//創建退出菜單項
private MenuItem exitItem = new MenuItem("退出");
//創建自動換行選擇框菜單項
private CheckboxMenuItem autoWrap = new CheckboxMenuItem("自動換行");
//創建複製菜單項
private MenuItem copyItem = new MenuItem("複製");
//創建粘貼菜單項
private MenuItem pasteItem = new MenuItem("粘貼");
//創建格式菜單
private Menu formatMenu = new Menu("格式");
//創建注釋菜單項
private MenuItem commentItem = new MenuItem("注釋");
//創建取消注釋菜單項
private MenuItem cancelItem = new MenuItem("取消注釋");
//創建一個文本域
private TextArea ta = new TextArea(6, 40);
public void init(){
//定義菜單事件監聽器
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
ta.append("單擊「"+command+"」菜單\n");
if (command.equals("退出")){
System.exit(0);
}
}
};
//為注釋菜單項和退出菜單項註冊監聽器
commentItem.addActionListener(listener);
exitItem.addActionListener(listener);
//為文件菜單fileMenu添加菜單項
fileMenu.add(newItem);
fileMenu.add(saveItem);
fileMenu.add(exitItem);
//為編輯菜單editMenu添加菜單項
editMenu.add(autoWrap);
editMenu.add(copyItem);
editMenu.add(pasteItem);
//為格式化菜單formatMenu添加菜單項
formatMenu.add(commentItem);
formatMenu.add(cancelItem);
//將格式化菜單添加到編輯菜單中,作為二級菜單
editMenu.add(new MenuItem("-"));
editMenu.add(formatMenu);
//將文件菜單和編輯菜單添加到菜單條中
menuBar.add(fileMenu);
menuBar.add(editMenu);
//把菜單條設置到frame窗口上
frame.setMenuBar(menuBar);
//把文本域添加到frame中
frame.add(ta);
//設置frame最佳大小並可見
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new SimpleMenu().init();
}
}
案例2:
通過PopupMenu實現下圖效果:

實現思路:
1.創建PopubMenu菜單組件;
2.創建多個MenuItem菜單項,並添加到PopupMenu中;
3.將PopupMenu添加到目標組件中;
4.為需要右擊出現PopubMenu菜單的組件,註冊滑鼠監聽事件,當監聽到用戶釋放右鍵時,彈出菜單。
演示程式碼2:
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class PopupMenuTest {
private Frame frame = new Frame("這裡測試PopupMenu");
// 創建PopubMenu菜單
private PopupMenu popupMenu = new PopupMenu();
// 創建菜單條
private MenuItem commentItem = new MenuItem("注釋");
private MenuItem cancelItem = new MenuItem("取消注釋");
private MenuItem copyItem = new MenuItem("複製");
private MenuItem pasteItem = new MenuItem("保存");
// 創建一個文本域
private TextArea ta = new TextArea("我愛中華!!!", 6, 40);
// 創建一個Panel
private Panel panel = new Panel();
public void init() {
// 把菜單項添加到PopupMenu中
popupMenu.add(commentItem);
popupMenu.add(cancelItem);
popupMenu.add(copyItem);
popupMenu.add(pasteItem);
// 設置panel大小
panel.setPreferredSize(new Dimension(300, 100));
// 把PopupMenu添加到panel中
panel.add(popupMenu);
// 為panel註冊滑鼠事件
panel.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
boolean flag = e.isPopupTrigger();
// 判斷當前滑鼠操作是不是觸發PopupMenu的操作
if (flag) {
// 讓PopupMenu顯示在panel上,並且跟隨滑鼠事件發生的地方顯示
popupMenu.show(panel, e.getX(), e.getY());
}
}
});
// 把ta添加到frame中間區域中
frame.add(ta);
// 把panel添加到frame底部
frame.add(panel, BorderLayout.SOUTH);
// 設置frame最佳大小,並可視;
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new PopupMenuTest().init();
}
}
公眾號本文地址://mp.weixin.qq.com/s/wTmc9O0aDtf_NPSis37-2A
個人部落格://kohler19.gitee.io/
公眾號:愚生淺末