Java Swing JTable; menu de clic droit (Comment puis-je obtenir "select" aka mettre en évidence la ligne)

bref: j'ai besoin d'un" événement clic droit " pour mettre en évidence la rangée de cellules.

j'utilise un JTable à l'intérieur d'un ScrollPane en Java Swing (Netbeans Matisse). J'ai un MouseClicked écouteur d'événement sur la JTable qui procède de la façon suivante:

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 le JTable, la ligne n'est pas en surbrillance (je mets la sélection en lignes uniquement btw). J'ai cherché plusieurs fonctions setSelected() mais je n'ai pas pu en trouver une qui convienne. Par par défaut, le clic gauche met automatiquement la ligne en évidence. Comment le configurer pour les bons clics?

27
demandé sur Carlo del Mundo 2010-08-24 19:47:14

2 réponses

comme ceci:

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
répondu clamp 2014-02-15 20:52:47

la réponse acceptée ne prend pas les touches modificatrices comme ctrl ou maj en compte, mais ils indiquent que la sélection courante être remplacé, mais étendue.

aussi, j'ai ajouté le support multi-OS en cochant mousePressedetmouseReleased.

ci-dessous, vous pouvez trouver un exemple complet sur la façon d'ajuster les lignes sélectionnées, en utilisant le ListSelectionModelMouseEvent#getModifiers vérifier. Après cela, il est possible d'ouvrir une (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
répondu Markus Weninger 2016-08-01 16:49:29