2010-08-24 30 views
27

Kısa: Hücre sırasını vurgulamak için bir "sağ tıklama olayı" na ihtiyacım var.Java Swing JTable; Sağ Tıklama Menüsü (Seçimi seçmek için "seç" seçeneğini belirleyin.)

Java Swing'de (Netbeans Matisse) bir ScrollPane içinde bir JTable kullanıyorum. Ben şunları yapar JTable bir MouseClicked olay dinleyicisi var: Ben JTable üzerine sağ klik yürütmek zaman sorun ..., satır vurgulanır değil edilir

(I satırlara set seçimi

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

sadece btw). Birkaç setSelected() işlevini aradım ancak uygun olanı bulamadım. Varsayılan olarak, sol tıklama otomatik olarak satırı vurgular. Doğru tıklamalar için nasıl ayarlarım? Böyle

cevap

80

: Kabul yanıt ctrl veya hesaba vardiya gibi değiştirici tuşları almaz, ama onlar işaret

+1

Aynen böyle:] ... mouseReleased() öğesinin üst yarısı ihtiyacım olan şeydir. Oylanacak + cevap olarak kabul edilecektir. Teşekkürler, siz erkeksiniz (ya da kadın)! –

+6

Harika cevap. Bir detay: bazı platformlarda (Mac OS X adını vermek için), popup menüsü 'mouseReleased' yerine' mousePressed 'ile tetiklenir. Bu kodu kullanırsanız, uygulamanızı Mac OS'de çalıştırırsanız pop-up görünmez X. – gabuzo

+0

RowIndex'i iki kez almanın amacı nedir? Yani, * r * ve * rowindex * arasındaki fark nedir? –

1

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

...... geçerli seçim olduğunu , değiştirilmemeli, ancak uzatılmalıdır. Ayrıca, vemouseReleased'u denetleyerek çoklu işletim sistemi desteğini ekledim.

Aşağıdaki, MouseEvent#getModifiers denetimlerini içeren ListSelectionModel kullanarak, seçilen satırların nasıl ayarlanacağı hakkında tam bir örnek bulabilirsiniz. Bundan sonra, bir (isteğe bağlı) JPopupMenu açmak mümkündür.

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

Manüel seçim işlemine gerek yok, JTable zaten SHIFT ve CTRL tuşlarına vb. Saygı duyar. Orijinal çözümde ihtiyaç duyulan tek değişiklik, setRowSelectionInterval() öğesinin, seçilen satırın zaten seçilmiş olması durumunda kullanılmamasıdır: eğer (! Table.getSelectionModel(). IsSelectedIndex (r)) table.setRowSelectionInterval (r, r); –