前面講解了如果構建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();
}
}
公眾號本文地址:https://mp.weixin.qq.com/s/wTmc9O0aDtf_NPSis37-2A
個人部落格:https://kohler19.gitee.io/
公眾號:愚生淺末