首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 計算器選單複製/貼上無效:缺少 ActionListener 註冊

     編輯:程式設計綜合問答

錯誤代碼片段

// 建立選單項
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(); }
        }
    }
    // ... 原有按鈕處理邏輯
}

關鍵補充:使用系統剪貼簿而非自建 StringBuffer

  • 原代碼用 `StringBuffer copyBoard` 模擬剪貼簿,**僅限應用內部複製貼上**,無法與瀏覽器、記事本等其他程式互通。
  • **標準做法**:`java.awt.datatransfer.Clipboard` + `StringSelection` / `DataFlavor.stringFlavor`,實現跨應用複製貼上。

Swing 事件模型核心口訣

**「組件建立 → 加入容器 → 註冊監聽器」** 三步缺一不可。
`JButton`、`JMenuItem`、`JTextField` (Action) 皆同理。

修正後,計算器選單「複製/貼上」即可正常運作,並支援系統剪貼簿互通。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved