Java Swing JTable; Menu contextuel (Comment puis-je le sélectionner pour sélectionner la ligne)



Answers

La réponse acceptée ne prend pas en compte les touches de modification telles que ctrl ou shift , mais elles indiquent que la sélection actuelle ne doit pas être remplacée, mais étendue.

En outre, j'ai ajouté le support multi-OS en vérifiant mousePressed et mouseReleased .

Vous trouverez ci-après un exemple complet sur l'ajustement des lignes sélectionnées à l'aide du ListSelectionModel , y compris les contrôles MouseEvent#getModifiers . Après cela, il est possible d'ouvrir un (facultatif) 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);
  }
});
Question

Short: J'ai besoin d'un "clic droit" pour mettre en évidence la ligne de la cellule.

J'utilise une JTable dans un ScrollPane dans Java Swing (Netbeans Matisse). J'ai un écouteur d'événement MouseClicked sur le JTable qui effectue les opérations suivantes:

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

Le problème est que chaque fois que j'exécute un clic droit sur la table JTable, la ligne n'est pas mise en surbrillance (j'ai défini la sélection uniquement sur les lignes btw). J'ai cherché plusieurs fonctions setSelected () mais je n'ai pas trouvé de fonction appropriée. Par défaut, un clic gauche met automatiquement la ligne en surbrillance. Comment puis-je le configurer pour les clics droits?




Related