JPopupMenu прослушивается в JScrollPane - PullRequest
0 голосов
/ 09 февраля 2019

Я написал программу, которая отображает таблицу внутри JScrollPane.Причина этого заключается в том, что, если таблица становится длинной, пользователь должен иметь возможность использовать полосу прокрутки.Кроме того, я хочу, чтобы пользователь мог открывать всплывающее меню при щелчке правой кнопкой мыши, чтобы редактировать или удалять данные.Сначала я думал, что моя реализация работает так, как показано на этом рисунке:

enter image description here

Позже я понял, что если я использую полосу прокрутки, что-то не так с позицией мыши ивсплывающее окно не в том месте, как показано здесь:

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

Я быхорошо, если кто-то знает решение для этого.

...