2010-11-08 3 views
6

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

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

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

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

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

+0

Возможный дубликат [Java Swing JTable; Меню правой кнопки мыши (как мне его выбрать «выбрать», а также выделить строку)] (http://stackoverflow.com/questions/3558293/java-swing-jtable-right-click-menu-how-do-i- get-it-to-select-aka-highlight-t) –

ответ

14
JTable.rowAtPoint(...); 

Вы можете получить сообщение от MouseEvent.

Edit:

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()); 
     } 
    } 
}); 
+0

Ну, часть проблемы в том, что MouseEvent отсутствует в месте в коде, где я хочу эту информацию. MouseEvent был использован для отображения всплывающего меню в нужном месте; событие, которое только что произошло, - ActionEvent, созданный, когда пользователь выбрал пункт меню. Таким образом, X-Y не связан с событием. Я могу сохранить MouseEvent (или X, Y) и передать его на свое событие различными способами, но я искал «более чистый» способ. – user492820

+1

@ user492820, проблема в том, что ваш код структурирован неправильно. «Чистый путь» - это выбор строки WHEN, когда отображается всплывающее окно. См. Мое редактирование для общего кода, чтобы сделать это. – camickr

2

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

+0

Нет, я не хочу его выбирать; Я думаю, что это нестандартное поведение, по крайней мере, в окне Windows. Я надеялся найти способ узнать это без этого. – user492820

+0

Я считаю, что это стандартное поведение для выбора ячейки или строки, на которой был выполнен щелчок правой кнопкой мыши. Если вы не хотите выбирать строку, сохраните номер строки в каком-либо параметре, доступном из вашего прослушивателя меню. –

+0

Ну, малоизвестные факты о якобы хорошо известных операционных системах. Я никогда не использую щелчок правой кнопкой мыши, чтобы выбрать что-то, и сумел забыть, что он это сделал. Спасибо, я буду использовать это (и camickr показал код для него в комментарии ниже. Спасибо всем. – user492820