我有一种情况,当右键单击JTable时,我会创建一个弹出菜单。创建弹出菜单的标准方法:
aJTable.setComponentPopupMenu(rightClickMenu);
现在,在注册的操作中,我无法找到右键单击的单元格以显示该弹出菜单。
rightClickMenuItem.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
// Work out what cell was right clicked to generate the menu
}
});
关于你如何做到这一点的任何想法?
答案 0 :(得分:5)
令人惊讶的事实:安装了componentPopupMenu后,mouseListener永远不会看到作为popupTrigger的mouseEvent(原因是显示componentPopup由BasicLookAndFeel安装的AWTEventListener全局处理,并且该侦听器使用该事件)。
唯一看到该触发器的mousePosition的地方是getPopupLocation(MouseEvent),因此获取它的唯一可靠方法(用于执行依赖于位置的配置/操作)是@Mad的建议,即覆盖该方法并存储价值某处供以后使用。
下面的代码段使用clientProperty作为存储位置:
final JTable table = new JTable(new AncientSwingTeam()) {
@Override
public Point getPopupLocation(MouseEvent event) {
setPopupTriggerLocation(event);
return super.getPopupLocation(event);
}
protected void setPopupTriggerLocation(MouseEvent event) {
putClientProperty("popupTriggerLocation",
event != null ? event.getPoint() : null);
}
};
JPopupMenu popup = new JPopupMenu();
Action action = new AbstractAction("show trigger location") {
@Override
public void actionPerformed(ActionEvent e) {
JPopupMenu parent = (JPopupMenu) SwingUtilities.getAncestorOfClass(
JPopupMenu.class, (Component) e.getSource());
JTable invoker = (JTable) parent.getInvoker();
Point p = (Point) invoker.getClientProperty("popupTriggerLocation");
String output = p != null ? "row/col: "
+ invoker.rowAtPoint(p) + "/" + invoker.columnAtPoint(p) : null;
System.out.println(output);
}
};
popup.add(action);
popup.add("dummy2");
table.setComponentPopupMenu(popup);
答案 1 :(得分:3)
@MadProgrammer对getPopupLocation的建议看起来很有希望,但我无法弄清楚如何在表和actionEvent之间获取信息......
我通过确保在右键单击时选择了行来解决这个问题 - >由于弹出菜单会阻止选择行,因此您可以添加一个鼠标监听器,以确保无论何时按下(向左或向右),该行都会被选中。
aTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int r = aTable.rowAtPoint(e.getPoint());
if (r >= 0 && r < clt.getRowCount()) {
aTable.setRowSelectionInterval(r, r);
} else {
aTable.clearSelection();
}
}
});
这意味着在rightClickMenuItem的动作侦听器中,您可以获取表格的选定单元格/行
rightClickMenuItem.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
aTable.get details about the selected one....
}
});
太容易了!谢谢大家的帮助。
答案 2 :(得分:0)
JTable有方法
int row = rowAtPoint(p);
int col = columnAtPoint(p);
所以传递MouseEvent的点并使用值
添加MouseListener
并将最后一个右键点存储在某处。