2017-04-16 28 views
6

Tôi có một số JTable và muốn cho phép bỏ chọn tất cả các hàng bằng cách nhấp vào một phần trống của bảng. Điều này hoạt động tốt cho đến nay. Tuy nhiên, mặc dù tôi gọi table.clearSelection(); bàn vẫn cho thấy một đường viền xung quanh tế bào kích hoạt trước đó (xem tế bào trong ví dụ):JTable: Xóa đường viền quanh ô khi xóa lựa chọn hàng

Table deselection issue

Tôi muốn thoát khỏi biên giới này là tốt (nó trông đặc biệt không phù hợp với giao diện và cảm nhận bản địa của Mac, nơi các tế bào đột nhiên chuyển sang màu đen).

Hoàn toàn làm việc tối thiểu mã ví dụ:

public class JTableDeselect extends JFrame { 
    public JTableDeselect() { 
     Object rowData[][] = { { "1", "2", "3" }, { "4", "5", "6" } }; 
     Object columnNames[] = { "One", "Two", "Three" }; 
     JTable table = new JTable(rowData, columnNames); 
     table.setFillsViewportHeight(true); 
     table.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if (table.rowAtPoint(e.getPoint()) == -1) { 
        table.clearSelection(); 
       } 
      } 
     }); 
     add(new JScrollPane(table)); 
     setSize(300, 150); 
    } 
    public static void main(String args[]) throws Exception { 
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
     new JTableDeselect().setVisible(true); 
    } 
} 

[sửa] Đã cố thêm table.getColumnModel().getSelectionModel().clearSelection(); được đề cập ở đây xung quanh. Nhưng điều này không giúp được gì.

Trả lời

3

Cố gắng thêm table.getColumnModel() getSelectionModel() clearSelection();..

Phương thức table.clearSelection() gọi phương thức đó và phương pháp clearSelection() của TableColumnModel.

Ngoài việc xóa các lựa chọn bạn cũng cần phải thiết lập lại "neo và dẫn" chỉ số của mô hình lựa chọn:

table.clearSelection(); 

ListSelectionModel selectionModel = table.getSelectionModel(); 
selectionModel.setAnchorSelectionIndex(-1); 
selectionModel.setLeadSelectionIndex(-1); 

TableColumnModel columnModel = table.getColumnModel(); 
columnModel.getSelectionModel().setAnchorSelectionIndex(-1); 
columnModel.getSelectionModel().setLeadSelectionIndex(-1); 

Bây giờ nếu bạn sử dụng các phím mũi tên trọng tâm sẽ đi đến (0, 0), vì vậy bạn sẽ mất thông tin về ô cuối cùng đã được nhấp.

Nếu bạn chỉ xóa mô hình lựa chọn, bạn sẽ mất thông tin hàng nhưng thông tin cột sẽ vẫn còn.

Thử nghiệm xóa một hoặc cả hai mô hình để có được hiệu ứng bạn mong muốn.

5

Vấn đề của bạn: ô bảng vẫn có tiêu điểm mặc dù vùng chọn bị mất và do đó nó tự vẽ nó bằng cách hiển thị đường viền dày. Biết một giải pháp có thể là tạo trình kết xuất đồ họa của riêng bạn để loại bỏ tiêu điểm của ô khi ô bị mất lựa chọn. Ví dụ:

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     if (!isSelected) { 
      hasFocus = false; 
     } 
     return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    } 
}); 
+0

Cảm ơn! Đơn giản và hiệu quả! – qqilihq

+0

@qqilihq, điều này giả định tất cả dữ liệu trong bảng sử dụng cùng trình kết xuất đồ họa. Để có giải pháp tổng quát hơn, ngoài việc xóa lựa chọn, bạn cần đặt lại các chỉ mục neo/chì của mô hình lựa chọn. Sau đó, bạn không cần một trình kết xuất tùy chỉnh. – camickr

+0

@camickr: cảm ơn vì điều này. 1+ cho câu trả lời của bạn –

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