reales - Java Swing JTable; Haga clic derecho en el menú(¿Cómo puedo obtener "seleccionar" también conocido como resaltar la fila)
libro de android studio en español pdf (2)
Corto: Necesito un "evento de clic derecho" para resaltar la fila de la celda.
Estoy usando una JTable dentro de un ScrollPane en Java Swing (Netbeans Matisse). Tengo un detector de eventos MouseClicked en JTable que hace lo siguiente:
if (evt.getButton() == java.awt.event.MouseEvent.BUTTON3) {
System.out.println("Right Click");
JPopUpMenu.show(myJTable, evt.getX(), evt.getY())
}
El problema es ... cada vez que ejecuto un clic derecho en JTable, la fila no se resalta (configuré la selección en filas solo por cierto). He buscado varias funciones setSelected () pero no pude encontrar una adecuada. De forma predeterminada, al hacer clic izquierdo, se resalta automáticamente la fila. ¿Cómo lo configuro para hacer clic derecho?
La respuesta aceptada no toma teclas modificadoras como ctrl o shift en la cuenta, sin embargo, indican que la selección actual no debe ser reemplazada, sino extendida.
Además, agregué compatibilidad con varios sistemas operativos al marcar mousePressed
y mouseReleased
.
A continuación, puede encontrar un ejemplo completo sobre cómo ajustar las filas seleccionadas, utilizando el ListSelectionModel
, incluidas las comprobaciones MouseEvent#getModifiers
. Después de eso, es posible abrir un JPopupMenu
(opcional).
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);
}
});
Me gusta esto:
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());
}
}
});
......