// 建立選單項
JMenuItem mCopy = new JMenuItem("複製(C)");
JMenuItem mPaste = new JMenuItem("貼上(V)");
// 加入選單
mEdit.add(mCopy);
mEdit.add(mPaste);
// 缺少:mCopy.addActionListener(this); mPaste.addActionListener(this);
`JMenuItem` 繼承自 `AbstractButton`,**必須註冊 `ActionListener` 才能響應點擊事件**。僅加入 `JMenu` 只負責顯示,不處理邏輯。原代碼中 `Calculator` 實作了 `ActionListener` 並註冊給數字鍵 (`keys[i].addActionListener(this)`),但**遺漏了選單項**。
// 在建構子中,加入選單項後立即註冊
mCopy.addActionListener(this);
mPaste.addActionListener(this);
// 可選:設定快捷鍵 (Mnemonics 已在 setMnemonic 設定,加速鍵需 KeyStroke)
mCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK));
mPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK));
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand(); // 取得選單項文字或 actionCommand
if ("複製(C)".equals(cmd) || "Copy".equals(cmd)) {
String text = resultText.getSelectedText(); // 僅複製選取文字
if (text != null) {
copyBoard.replace(0, copyBoard.length(), text);
// 或系統剪貼簿:Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text), null);
}
} else if ("貼上(V)".equals(cmd) || "Paste".equals(cmd)) {
// 從系統剪貼簿讀取
Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
resultText.replaceSelection((String) t.getTransferData(DataFlavor.stringFlavor));
} catch (Exception ex) { ex.printStackTrace(); }
}
}
// ... 原有按鈕處理邏輯
}
**「組件建立 → 加入容器 → 註冊監聽器」** 三步缺一不可。
`JButton`、`JMenuItem`、`JTextField` (Action) 皆同理。
修正後,計算器選單「複製/貼上」即可正常運作,並支援系統剪貼簿互通。