Найдите строку JTable, в которой было вызвано всплывающее меню.

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

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

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

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

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


person user492820    schedule 08.11.2010    source источник
comment


Ответы (2)


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());
        }
    }
});
person camickr    schedule 08.11.2010
comment
Что ж, часть проблемы в том, что в том месте кода, где мне нужна эта информация, нет события MouseEvent. MouseEvent был использован для отображения всплывающего меню в нужном месте; только что произошедшее событие — это ActionEvent, сгенерированное, когда пользователь выбрал пункт меню. Так что нет никаких X, Y, связанных с событием. Я могу сохранить MouseEvent (или X, Y) и передать его моему событию различными способами, но я искал более «чистый» способ. - person user492820; 08.11.2010
comment
@ user492820, проблема в том, что ваш код неправильно структурирован. Более чистый способ - выбрать строку, КОГДА отображается всплывающее окно. См. мое редактирование для общего кода, чтобы сделать это. - person camickr; 08.11.2010

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

person Denis Tulskiy    schedule 08.11.2010
comment
Нет, я не хочу его выбирать; Я думаю, что это нестандартное поведение, по крайней мере, для Windows. Я надеялся найти способ узнать это без этого. - person user492820; 08.11.2010
comment
я считаю, что это стандартное поведение для выбора ячейки или строки, на которой был выполнен щелчок правой кнопкой мыши. Если вы не хотите выбирать строку, сохраните номер строки в каком-либо параметре, доступном из вашего прослушивателя меню. - person Denis Tulskiy; 08.11.2010
comment
Ну и малоизвестные факты о якобы всем известных операционных системах. Я никогда не использую щелчок правой кнопкой мыши, чтобы выбрать что-то, и мне удалось забыть, что он это сделал. Спасибо, я воспользуюсь этим (и camickr показал его код в комментарии ниже. Спасибо всем. - person user492820; 09.11.2010