Как я могу выбрать элемент списка / дерева / таблицы с помощью щелчка правой кнопкой мыши и одновременно открыть контекстное меню? - PullRequest
1 голос
/ 04 августа 2020

Когда я щелкаю правой кнопкой мыши элемент в таблице / дереве / списке Swing,

  • этот элемент должен быть выбран, а
  • должно быть соответствующее JPopupMenu (контекстное меню). показано.

Как я могу этого добиться?

Я использую component.setComponentPopupMenu(popupMenu) для регистрации всплывающих меню для моих компонентов, которые, кажется, проглатывают событие щелчка правой кнопкой мыши, так что целевой элемент никогда не выбирается.

1 Ответ

1 голос
/ 04 августа 2020

Проблема здесь в том, что щелчок правой кнопкой мыши действительно используется встроенным триггером всплывающего окна. Чтобы обойти это, переопределите метод JPopupMenu.show(...), подобный этому (примеры для JTable, JList и JTree работают аналогично):

public class ExtJPopupMenu extends JPopupMenu {

[...]

    @Override
    public void show(final Component invoker, final int x, final int y) {
        if (invoker instanceof JTable) {
            final JTable table = (JTable) invoker;
            final int selRow = table.rowAtPoint(new Point(x, y));
            if (selRow > -1 && !table.getSelectionModel().isSelectedIndex(selRow)) {
                table.getSelectionModel().setSelectionInterval(selRow, selRow);
            }
        }

        // ensure the newly selected item is focused
        invoker.requestFocus();

        // now build the appropriate menu for the selected item
        [...]

        // finally show the menu
        super.show(invoker, x, y);
    }
}

Зарегистрируйте свой ExtJPopupMenu экземпляр с вашей таблицей, используя table.setComponentPopupMenu(...).

...