2010-08-24 2 views
27

Короткие: мне нужно «щелкнуть правой кнопкой мыши событие», чтобы выделить строку ячейки.Java Swing JTable; Меню правой кнопки мыши (как мне его выбрать «выбрать», а также выделить строку)

Я использую JTable внутри ScrollPane в Java Swing (Netbeans Matisse). У меня есть слушатель событий MouseClicked на JTable, который делает следующее:

if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) { 
      System.out.println("Right Click"); 
      JPopUpMenu.show(myJTable, evt.getX(), evt.getY()) 
} 

Проблема ... всякий раз, когда я исполняю правую кнопку мыши на JTable, строка не выделена (я устанавливаю выбор для строк только кстати). Я искал несколько функций setSelected(), но не смог найти подходящий. По умолчанию щелчок левой кнопкой автоматически выделяет строку. Как настроить его для правого клика?

ответ

80

так:

table.addMouseListener(new MouseAdapter() { 
    @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(); 
     } 

     int rowindex = table.getSelectedRow(); 
     if (rowindex < 0) 
      return; 
     if (e.isPopupTrigger() && e.getComponent() instanceof JTable) { 
      JPopupMenu popup = createYourPopUp(); 
      popup.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
}); 

......

+1

Точно так же:] ... верхняя половина mouseReleased() - это то, что мне нужно. Будет принято решение + принято в качестве ответа. Спасибо, ты мужчина (или женщина)! –

+6

Отличный ответ. Подробно: на некоторых платформах (Mac OS X, чтобы назвать его) всплывающее меню запускается с помощью 'mousePressed', а не' mouseReleased', поэтому, если вы используете этот код, всплывающее окно не будет отображаться, если вы запустите приложение на Mac OS X. – gabuzo

+0

Какова цель получения rowIndex два раза? Я имею в виду, в чем разница между * r * и * rowindex *? –

1

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

Кроме того, я добавил поддержку нескольких ОС, проверив mousePressedиmouseReleased.

Ниже вы можете найти полный пример того, как отрегулировать выбранные строки, используя ListSelectionModel, включая проверки MouseEvent#getModifiers. После этого можно открыть (необязательно) JPopupMenu.

JPopupMenu contextMenu = new JPopupMenu(); 
// ... 
// add elements to the popup menu 
// ... 

table.addMouseListener(new MouseAdapter() { 
    @Override 
    public void mousePressed(MouseEvent e) { 
    handleRowClick(e); 
    if (e.isPopupTrigger()) { 
     doPop(e); 
    } else { 
     hidePop(); 
    } 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    if (e.isPopupTrigger()) { 
     doPop(e); 
    } 
    } 

    private void handleRowClick(MouseEvent e) { 
    ListSelectionModel selectionModel = table.getSelectionModel(); 
    Point contextMenuOpenedAt = e.getPoint(); 
    int clickedRow = table.rowAtPoint(contextMenuOpenedAt); 

    if (clickedRow < 0) { 
     // No row selected 
     selectionModel.clearSelection(); 
    } else { 
     // Some row selected 
     if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) { 
     int maxSelect = selectionModel.getMaxSelectionIndex(); 

     if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) { 
      // Shift + CTRL 
      selectionModel.addSelectionInterval(maxSelect, clickedRow); 
     } else { 
      // Shift 
      selectionModel.setSelectionInterval(maxSelect, clickedRow); 
     } 
     } else if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) { 
     // CTRL 
     selectionModel.addSelectionInterval(clickedRow, clickedRow); 
     } else { 
     // No modifier key pressed 
     selectionModel.setSelectionInterval(clickedRow, clickedRow); 
     } 
    } 
    } 

    private void doPop(MouseEvent e) { 
    if (table.getSelectedRowCount() == 0) { 
     return; 
    } 
    contextMenu.setVisible(true); 
    contextMenu.show(e.getComponent(), e.getX(), e.getY()); 
    } 

    private void hidePop() { 
    contextMenu.setVisible(false); 
    } 
}); 
+0

Нет необходимости в ручном управлении выбором, JTable уже относится к клавишам SHIFT и CTRL и так далее. Единственное изменение, которое необходимо в исходном решении, - это не использовать setRowSelectionInterval() в случае, если выбранная сфокусированная строка уже выбрана, например: if (! Table.getSelectionModel(). IsSelectedIndex (r)) table.setRowSelectionInterval (r, r); –