首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JTable ->上的JPopupMenu获取创建菜单的单元格

问JTable ->上的JPopupMenu获取创建菜单的单元格
EN

Stack Overflow用户
提问于 2012-12-11 14:31:37
回答 3查看 3.4K关注 0票数 4

我有一种情况,当右键单击JTable时,我创建了一个弹出式菜单。创建弹出菜单的标准方法:

代码语言:javascript
复制
aJTable.setComponentPopupMenu(rightClickMenu);

现在,在注册的操作中,我找不到右键单击哪个单元格来显示弹出菜单。

代码语言:javascript
复制
rightClickMenuItem.addActionListener(new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // Work out what cell was right clicked to generate the menu
    }

});

你对如何做到这一点有什么想法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-12 11:38:37

@MadProgrammer关于getPopupLocation的建议看起来很有希望,但我不知道如何在表格和actionEvent之间传递信息……

我解决这个问题的方法是,确保在右击该行时该行被选中。由于弹出菜单阻止选择该行,您可以添加一个鼠标侦听器,确保无论按下什么(左键或右键),该行都会被选中。

代码语言:javascript
复制
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的操作侦听器中,您可以抓取表的选定单元格/行

代码语言:javascript
复制
rightClickMenuItem.addActionListener(new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent e) {
        aTable.get details about the selected one....
    }
});

太简单了!感谢大家的帮助。

票数 3
EN

Stack Overflow用户

发布于 2013-06-26 17:53:04

令人惊讶的事实:在安装了componentPopupMenu的情况下,mouseListener永远看不到作为popupTrigger的mouseEvent (原因是显示componentPopup是由BasicLookAndFeel安装的AWTEventListener全局处理的,并且侦听器使用该事件)。

唯一能看到触发器的mousePosition的地方是getPopupLocation(MouseEvent),所以获得它的唯一可靠方法(用于执行位置相关的配置/操作)是@Mad的建议,覆盖该方法并将值存储在某个地方供以后使用。

下面的代码片段使用clientProperty作为存储位置:

代码语言:javascript
复制
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);
票数 5
EN

Stack Overflow用户

发布于 2012-12-11 16:08:12

JTable有一些方法

代码语言:javascript
复制
int row = rowAtPoint(p);
int col = columnAtPoint(p);

因此传递MouseEvent的点并使用值

添加一个MouseListener并将最后一个右击点存储在某个位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13814861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档