[英]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.