web-dev-qa-db-fra.com

Java Swing JTable; Menu clic droit (Comment puis-je le faire pour "sélectionner" aka mettre en surbrillance la ligne)

Bref: j'ai besoin d'un "événement de clic droit" pour mettre en surbrillance la ligne de cellule.

J'utilise une JTable dans un ScrollPane dans Java Swing (Netbeans Matisse). J'ai un écouteur d'événements MouseClicked sur la JTable qui fait ce qui suit:

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

Le problème est ... chaque fois que j'exécute un clic droit sur la table JT, la ligne n'est pas mise en surbrillance (j'ai défini la sélection sur les lignes uniquement 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 en surbrillance la ligne. Comment le configurer pour les clics droits?

29
Carlo del Mundo

comme ça:

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

......

83
clamp

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

J'ai également ajouté la prise en charge multi-OS en vérifiant mousePressed et mouseReleased.

Vous trouverez ci-dessous un exemple complet sur la façon d'ajuster les lignes sélectionnées, en utilisant ListSelectionModel , y compris MouseEvent#getModifiers vérifie. 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);
  }
});
1
Markus Weninger