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?
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());
}
}
});
......
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 mousePressed
etmouseReleased
.
ci-dessous, vous pouvez trouver un exemple complet sur la façon d'ajuster les lignes sélectionnées, en utilisant le ListSelectionModel
MouseEvent#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);
}
});