首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Swing 彈出式選單實作:JPopupMenu 滑鼠觸發與動作處理

     編輯:Java 相關知識

核心機制

JPopupMenu 必須在**滑鼠事件**中判斷 isPopupTrigger() 為真時顯示。不同平台觸發方式不同(Windows:右鍵釋放;macOS:Ctrl+左鍵或右鍵),因此**必須同時監聽 mousePressed 與 mouseReleased**。

完整範例代碼


public class Popup extends JPanel {
    JPopupMenu popup = new JPopupMenu();
    JTextField textField = new JTextField(10);

    public Popup() {
        add(textField);

        ActionListener menuAction = e -> 
            textField.setText(((JMenuItem) e.getSource()).getText());

        // 建立選單項
        Stream.of("Hither", "Yon", "Afar", "Stay Here")
            .forEach(name -> {
                JMenuItem item = new JMenuItem(name);
                item.addActionListener(menuAction);
                popup.add(item);
                if ("Afar".equals(name)) popup.addSeparator();
            });

        // 同一監聽器註冊到面板與文字欄位
        MouseAdapter listener = new MouseAdapter() {
            public void mousePressed(MouseEvent e) { showPopup(e); }
            public void mouseReleased(MouseEvent e) { showPopup(e); }
            private void showPopup(MouseEvent e) {
                if (e.isPopupTrigger())
                    popup.show(e.getComponent(), e.getX(), e.getY());
            }
        };
        addMouseListener(listener);
        textField.addMouseListener(listener);
    }
    // main()...
}

關鍵要點總結

  1. 雙事件監聽:mousePressed + mouseReleased 覆蓋跨平台觸發差異。
  2. isPopupTrigger():唯一可靠判斷是否為彈出觸發的方法,**不可**自行判斷滑鼠按鍵。
  3. show(Component, x, y):相對於指定元件座標顯示,確保位置正確。
  4. 共享 ActionListener:透過 e.getSource() 取得選單項文字,簡化邏輯。
  5. 分隔符:popup.addSeparator() 視覺分組。

常見錯誤避坑

錯誤做法後果正確做法
只監聽 mouseClickedmacOS 無法觸發監聽 pressed + released
用 e.getButton() == MouseEvent.BUTTON3 判斷跨平台失效用 e.isPopupTrigger()
在 ActionListener 中用 getSource() 強轉 JMenuItem若選單含非 JMenuItem 元件拋 ClassCastException加 instanceof 檢查或統一元件類型

進階應用

  • 動態選單:在 showPopup() 中根據上下文重建 JPopupMenu 內容。
  • 鍵盤快捷鍵:item.setAccelerator(KeyStroke.getKeyStroke('H'))。
  • 圖示支援:new JMenuItem("Copy", new ImageIcon("copy.png"))。
  • 子選單:JMenu sub = new JMenu("More"); popup.add(sub); sub.add(new JMenuItem("Option"));。

結語

JPopupMenu 雖 API 簡單,但**跨平台觸發機制**是關鍵難點。掌握「雙事件 + isPopupTrigger() + 相對座標顯示」三步曲,即能實作健壯、符合原生體驗的右鍵選單。

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