2010-08-24 30 views
27

Tóm tắt: Tôi cần "sự kiện nhấp chuột phải" để tô sáng hàng ô.Java Swing JTable; Menu Nhấp chuột phải (Làm thế nào để làm cho nó "chọn" hay còn gọi là tô sáng hàng)

Tôi đang sử dụng JTable bên trong một ScrollPane trong Java Swing (Netbeans Matisse). Tôi có một sự kiện nghe MouseClicked trên JTable nào sau đây:

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

Vấn đề là ... bất cứ khi nào tôi thực hiện một nhấp chuột phải vào JTable, hàng không được đánh dấu (tôi đặt sự lựa chọn để hàng chỉ btw). Tôi đã tìm một số hàm setSelected() nhưng không thể tìm thấy một hàm phù hợp. Theo mặc định, nhấp chuột trái sẽ tự động làm nổi bật hàng. Làm thế nào để tôi thiết lập nó cho các nhấp chuột phải?

Trả lời

80

như thế này:

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

......

+1

Giống như vậy:] ... nửa trên của con chuộtĐược phát hành() là những gì tôi cần. Sẽ được bình chọn lên + chấp nhận làm câu trả lời. Cảm ơn, bạn là người đàn ông (hoặc phụ nữ)! –

+6

Câu trả lời hay. Chi tiết: trên một số nền tảng (Mac OS X đặt tên cho nó), trình đơn bật lên được kích hoạt bởi 'mousePressed' thay vì 'mouseReleased' vì vậy nếu bạn sử dụng mã này, cửa sổ bật lên sẽ không hiển thị nếu bạn chạy ứng dụng của mình trên Mac OS X. – gabuzo

+0

Mục đích của việc lấy rowIndex hai lần là gì? Ý tôi là, sự khác nhau giữa * r * và * rowindex * là gì? –

1

Câu trả lời được chấp nhận không lấy chìa khóa modifier như ctrl hay thay đổi vào tài khoản, tuy nhiên họ chỉ ra rằng các lựa chọn hiện tại nên không được thay thế, nhưng được mở rộng.

Ngoài ra, tôi đã thêm hỗ trợ đa hệ điều hành bằng cách kiểm tra mousePressedmouseReleased.

Sau đây, bạn có thể tìm thấy ví dụ hoàn chỉnh về cách điều chỉnh các hàng đã chọn, sử dụng ListSelectionModel, bao gồm séc MouseEvent#getModifiers. Sau đó, bạn có thể mở một (tùy chọn) 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); 
    } 
}); 
+0

Không cần xử lý lựa chọn thủ công, JTable đã tôn trọng các phím SHIFT và CTRL, v.v. Sự thay đổi duy nhất cần thiết trong giải pháp ban đầu là không sử dụng setRowSelectionInterval() trong trường hợp hàng tập trung đã được chọn, như: if (! Table.getSelectionModel(). IsSelectedIndex (r)) table.setRowSelectionInterval (r, r); –

Các vấn đề liên quan