Java Swing JTable; Меню правого клика (как мне сделать так, чтобы оно «выделилось» или выделило строку) - PullRequest
28 голосов
/ 24 августа 2010

Коротко: мне нужно «событие щелчка правой кнопкой мыши», чтобы выделить строку ячейки.

Я использую 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 (), но не смог найти подходящую.По умолчанию щелчок левой кнопкой мыши автоматически выделяет строку.Как настроить его для правых кликов?

Ответы [ 2 ]

82 голосов
/ 24 августа 2010

как это:

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 голос
/ 01 августа 2016

В принятом ответе не учитываются клавиши-модификаторы, такие как ctrl или shift , однако они указывают на то, что текущий выбор следует не заменить, а расширить .

Кроме того, я добавил поддержку нескольких ОС, проверив 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);
  }
});
...