簡體   English   中英

如何在 SwingGui 中調用鼠標右鍵單擊事件?

[英]How can I call the mouse right click event in SwingGui?

我有一張桌子。 如果我右鍵單擊我得到一個 JPopUpMenu 但在彈出窗口之前我想選擇完成右鍵單擊事件的行。 這是我嘗試過的。

path_tbl.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println(e.getPoint());

            Point point = e.getPoint();
            int selectedRow = path_tbl.rowAtPoint(point);
            path_tbl.setRowSelectionInterval(selectedRow, selectedRow);
        }
    });

在那種情況下,當我右鍵單擊時,我無法從控制台獲得任何輸出。 但是,當我左鍵單擊時,點會打印到控制台。

java.awt.Point[x=105,y=76]

因此,此事件僅在我左鍵單擊時有效。 如何通過右鍵單擊使此事件起作用?

由於您需要自定義鼠標行為,因此不應使用setComponentPopupMenu

相反,使用 JPopupMenu 的show方法自己顯示 JPopupMenu:

JPopupMenu menu = /* ... */;

path_tbl.addMouseListener(new MouseAdapter() {
    private void showPopupMenuFor(MouseEvent e) {
        if (menu.isPopupTrigger(e)) {
            Point point = e.getPoint();
            int row = path_tbl.rowAtPoint(point);

            if (!path_tbl.isRowSelected(row)) {
                path_tbl.setRowSelectionInterval(row, row);
            }

            menu.show(path_tbl, e.getX(), e.getY());
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {
        showPopupMenuFor(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        showPopupMenuFor(e);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        showPopupMenuFor(e);
    }
});

您必須在 mousePressedmouseReleased 中檢查 MouseEvent,因為觸發上下文菜單的確切時間取決於平台和外觀。 (檢查 mouseClicked 可能是必要的,也可能不是必要的,但這並沒有什么壞處。)

在大多數情況下,我很懶惰,所以如果我不需要做某事,那我寧願不做。 在這種情況下,我希望盡可能多地使用現有的 API 工作,也就是說,使用JComponent#setComponentPopupMenu ,因為它會處理彈出窗口應該顯示的“方式”和“時間”,基於當前平台。

但是,正如您所發現的,默認情況下,當用戶按下“右鍵”鼠標按鈕時, JTable不會選擇該行,為此,您可以繼續當前的工作流程,但是,檢查MouseEvent是否實際上是“右鍵點擊。

幸運的是,一些最初的 Swing 開發人員也很“懶惰”,他們為我們提供了SwingUtilities.isRightMouseButton ,是的 🎉

在此處輸入圖像描述

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public final class Main {
    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            DefaultTableModel model = new DefaultTableModel(0, 10);
            for (int row = 0; row < 10; row++) {
                Vector data = new Vector(10);
                for (int col = 0; col < 10; col++) {

                    String value = row + "x" + ((char) (col + 'A'));
                    data.add(value);

                }
                model.addRow(data);
            }

            JPopupMenu menu = new JPopupMenu();
            menu.add("Hello");
            menu.add("This looks interesting");
            menu.add("I like bi-planes");

            JTable table = new JTable(model);
            table.setComponentPopupMenu(menu);
            table.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (SwingUtilities.isRightMouseButton(e)) {
                        Point point = e.getPoint();
                        int row = table.rowAtPoint(point);

                        if (!table.isRowSelected(row)) {
                            table.setRowSelectionInterval(row, row);
                        }
                    }
                }

            });
            add(new JScrollPane(table));
        }

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM