Найдите строку JTable, для которой было вызвано всплывающее меню - PullRequest
6 голосов
/ 08 ноября 2010

У меня есть JTable и всплывающее меню, специфичное для каждой строки.Я хочу вычислить строку, в которой пользователь щелкнул правой кнопкой мыши его (Windows L & F), чтобы вызвать всплывающее меню.

Я создаю MouseListener для таблицы, чтобы он получал MouseEvent по щелчку, ипоказывает всплывающее меню в правильном месте.Но когда пользователь выбирает один элемент во всплывающем меню, я не могу найти способ определить, какой была строка, где пользователь щелкнул правой кнопкой мыши в первую очередь.Событие для вызова всплывающего меню больше не имеет координат x, y, где щелчок правой кнопкой мыши произошел.

Я смотрел, как получить позицию всплывающего окна, но оно относится к фрейму., а не таблица, поэтому ни у него, ни у его родителя нет нужных значений x, y для того, что я хочу.

Я обошел это, создав подкласс JPopupMenu и установив значения x и y, которые я хочу,в MouseListener.Но мне кажется, что это будет общей проблемой для любого, кто хочет разместить всплывающее меню на JTable, и мне интересно, что я пропустил.

Есть ли более простой способ сделать это,особенно тот, который не включает создание подклассов JPopupMenu?

Ответы [ 2 ]

14 голосов
/ 08 ноября 2010
JTable.rowAtPoint(...);

Вы можете получить очко от MouseEvent.

Редактировать:

table.addMouseListener( new MouseAdapter()
{
    public void mouseReleased(MouseEvent e)
    {
        if (e.isPopupTrigger())
        {
            JTable source = (JTable)e.getSource();
            int row = source.rowAtPoint( e.getPoint() );
            int column = source.columnAtPoint( e.getPoint() );

            if (! source.isRowSelected(row))
                source.changeSelection(row, column, false, false);

            popup.show(e.getComponent(), e.getX(), e.getY());
        }
    }
});
2 голосов
/ 08 ноября 2010

Если вы не возражаете против выбора строки по щелчку правой кнопкой мыши, то в MouseListener используйте JTable.rowAtPoint () и выберите строку, если она не выбрана, а затем в всплывающем прослушивателе используйте JTable.getSelectedRows () для обработки ваших строк. Или вы можете сохранить их в отдельной структуре данных, к которой вы можете получить доступ из прослушивателя всплывающего меню.

...