Java Swing JTable; Menu clic destro (Come faccio a “selezionare” o evidenziare la riga)

Breve: ho bisogno di un “evento clic destro” per evidenziare la riga della cella.

Sto usando un JTable all’interno di un ScrollPane in Java Swing (Netbeans Matisse). Ho un listener di eventi MouseClicked su JTable che effettua le seguenti operazioni:

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

Il problema è che … ogni volta che eseguo un clic destro su JTable, la riga non è evidenziata (ho impostato la selezione solo sulle righe btw). Ho cercato diverse funzioni setSelected () ma non ho trovato quello adatto. Per impostazione predefinita, il clic con il tasto sinistro evidenzia automaticamente la riga. Come faccio a configurarlo per i clic giusti?

come questo:

 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 risposta accettata non accetta i tasti modificatori come ctrl o shift in account, tuttavia indicano che la selezione corrente non deve essere sostituita, ma estesa.

Inoltre, ho aggiunto il supporto multi-OS controllando mousePressed e mouseReleased .

Di seguito, è ansible trovare un esempio completo su come regolare le righe selezionate, utilizzando ListSelectionModel , inclusi i controlli MouseEvent#getModifiers . Dopodiché, è ansible aprire un JPopupMenu (facoltativo).

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