setMenuBar())MenuBar、Menu、MenuItem、CheckboxMenuItem//: Menu1.java
import java.awt.*;
public class Menu1 extends Frame {
String[] flavors = {"Chocolate","Strawberry","Vanilla Fudge Swirl","Mint Chip",
"Mocha Almond Fudge","Rum Raisin","Praline Cream","Mud Pie"};
TextField t = new TextField("No flavor", 30);
MenuBar mb1 = new MenuBar(), mb2 = new MenuBar();
Menu f = new Menu("File"), m = new Menu("Flavors"), s = new Menu("Safety");
CheckboxMenuItem[] safety = {new CheckboxMenuItem("Guard"), new CheckboxMenuItem("Hide")};
MenuItem[] file = {new MenuItem("Open"), new MenuItem("Exit")};
Menu fooBar = new Menu("fooBar");
MenuItem[] other = {new MenuItem("Foo"), new MenuItem("Bar"), new MenuItem("Baz")};
Button b = new Button("Swap Menus");
public Menu1() {
// Flavors 選單動態建構
for (int i=0; i
使用陣列 + 迴圈建構選單項,而非手寫重複 add(),便於維護增刪項目。
MenuItem,自動處理核取狀態切換evt.target.equals(menuItemRef) 比對物件getState()/setState(boolean) 讀寫狀態Menu 可加入另一個 Menu 形成子選單 (範例中 Safety 掛在 File 下)。
m.addSeparator() 插入視覺分隔,提升可讀性。
Java 1.1 新增:new MenuItem("Exit", new MenuShortcut(KeyEvent.VK_E)) 設定 Ctrl+E 快捷鍵,自動顯示於選單項旁。
getMenuBar() 取得目前選單列,setMenuBar(newBar) 即時切換,展示選單列可動態替換特性。
arg.equals("Open") 依賴標籤文字,修改語言/拼寫即失效。最佳實踐:setActionCommand("cmd_open") 設定不變命令字串,程式碼檢查 e.getActionCommand(),支援國際化 (i18n)。
嘗試將同一 Menu 加入兩個 MenuBar 會導致異常行為,每個選單項只能屬於單一父容器。
| 技術 | 核心類別 | 關鍵差異 |
|---|---|---|
| Swing | JMenuBar, JMenu, JMenuItem, JCheckBoxMenuItem | 支援圖示、快捷鍵、動作 (Action) 共用邏輯、鍵盤導航、外觀可換膚 |
| JavaFX | MenuBar, Menu, MenuItem, CheckMenuItem | FXML 宣告式、CSS 樣式、屬性綁定、Accelerator 快捷鍵、ContextMenu 右鍵選單 |
setActionCommand) 分離顯示文字與程式邏輯,支援多語系。Action (Swing) 或 EventHandler (JavaFX) 實現複用。選單看似簡單,實則是應用程式功能架構的地圖,設計良好的選單系統能大幅降低使用者認知負荷。