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