Java Swing JTable; kliknij prawym przyciskiem myszy Menu (Jak to zrobić, aby" wybrać " aka podświetlić wiersz)

Krótki: potrzebuję zdarzenia "kliknij prawym przyciskiem myszy", aby podświetlić wiersz komórki.

Używam JTable wewnątrz ScrollPane w Javie Swing (Netbeans Matisse). Mam ustawiony myszką słuchacz zdarzeń na JTable, który wykonuje następujące czynności:

if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
          System.out.println("Right Click");
          JPopUpMenu.show(myJTable, evt.getX(), evt.getY())
}
Problem w tym, że ... .. ilekroć wykonuję kliknięcie prawym przyciskiem myszy na JTable, wiersz nie jest podświetlony(ustawiam wybór na wiersze tylko btw). Szukałem kilku funkcji setSelected (), ale nie mogłem znaleźć odpowiedniej. Domyślnie kliknięcie lewym przyciskiem myszy automatycznie podświetla wiersz. Jak ustawić odpowiednie kliknięcia?
Author: Carlo del Mundo, 2010-08-24

2 answers

Tak:

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

......

 80
Author: clamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-15 20:52:47

Zaakceptowana odpowiedź nie uwzględnia klawiszy modyfikujących, takich jak ctrllub shift, jednak wskazują one, że bieżący wybór powinien nie być zastąpiony, ale rozszerzony.

Ponadto dodałem obsługę wielu systemów operacyjnych, sprawdzając mousePressed oraz mouseReleased.

Poniżej znajduje się pełny przykład dostosowywania zaznaczonych wierszy za pomocą ListSelectionModel, w tym MouseEvent#getModifiers czeki. Następnie można otworzyć (opcjonalnie) 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);
  }
});
 1
Author: Markus Weninger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-01 16:49:29