[英]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);
}
});
您必須在 mousePressed和mouseReleased 中檢查 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.