JPopupMenu错误在JScrollPane中

时间:2019-02-09 20:22:29

标签: java swing jscrollpane jpopupmenu

我已经编写了一个程序,该程序在JScrollPane内部显示一个表。这样做的原因是,如果表过长,则用户应该能够使用滚动条。此外,我希望用户能够在右键单击上打开弹出菜单来编辑或删除数据。起初,我认为我的实现可以如以下图像所示工作:

enter image description here

后来我意识到,如果我使用scollbar,鼠标位置会出现问题,并且弹出窗口位于错误的位置,如下所示:

enter image description here

鼠标位于突出显示的条目上。

这是我的代码:

table.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {
            if (e.isPopupTrigger()){
                rightClickPopUpOnTable(tablePanel.getComponentAt(e.getX(), e.getY()), e.getX(), e.getY());
                //rightClickPopUpOnTable(tablePanel.getComponentAt(e.getXOnScreen(), e.getYOnScreen()), e.getXOnScreen(), e.getYOnScreen());
            }

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            int r = table.rowAtPoint(e.getPoint());
            if (r >= 0 && r < table.getRowCount()) {
                table.setRowSelectionInterval(r, r);
            } else {
                table.clearSelection();
            }


            if (e.isPopupTrigger()){
                rightClickPopUpOnTable(tablePanel.getComponentAt(e.getX(), e.getY()), e.getX(), e.getY());
               //rightClickPopUpOnTable(tablePanel.getComponentAt(e.getXOnScreen(), e.getYOnScreen()), e.getXOnScreen(), e.getYOnScreen());
            }

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    });

 public void rightClickPopUpOnTable(Component component, int x, int y){
    JPopupMenu pop = new JPopupMenu();
    pop.setVisible(true);
    pop.setFocusable(false);

    JMenuItem item = new JMenuItem("Edit");
    item.addActionListener(new ActionListener() {
        @java.lang.Override
        public void actionPerformed(ActionEvent e) {
            handler.getData().showData(table.getValueAt(table.getSelectedRow(),0).toString());
        }
    });
    JMenuItem item2 = new JMenuItem("Delete");
    item2.addActionListener(new ActionListener() {
        @java.lang.Override
        public void actionPerformed(ActionEvent e) {
            int dialogResult = JOptionPane.showConfirmDialog (null, "Are you sure you want to delete "+table.getValueAt(table.getSelectedRow(), 0).toString()+"?","Delete Confirmation",JOptionPane.YES_NO_OPTION);
            if(dialogResult == JOptionPane.YES_OPTION){
                //DO STUFF
            }
        }
    });

    pop.add(item);
    pop.add(item2);
    pop.show(component, x, y);
}

我找到了一种通过使用e.getXOnScreen()来部分“修复”问题的方法,如您在代码中所看到的。现在,弹出窗口显示在正确的位置,但是它将不再突出显示项目,也不会关闭,如下所示:

enter image description here

如果有人知道解决方案,我会很好。

0 个答案:

没有答案