2011-06-28 5 views
14

Cách tiếp cận nào để sử dụng để có khả năng ẩn/xóa các cột trong bảng trong SWT (trong Eclipse plugin nói riêng)?Cách ẩn/xóa cột trong bảng SWT

  1. Không thể chuyển chức năng này sang hàng, vì tôi cần chèn và ẩn (hoặc xóa) cả hai hàng và cột.
  2. Tôi đã cố gắng xóa chúng bằng TableColumn.dispose(), nhưng theo ColumnWeightData trong bố cục không bị xóa và đặt lại toàn bộ bố cục bảng với TableLayout mới không xóa thông tin về các cột từ bố cục.
  3. Tôi đã cố gắng tạo tất cả các cột cần thiết và ẩn với setWidth (0) những cột cần được ẩn/xóa. Mã mẫu mà tôi đã viết là here. Cách tiếp cận này không tốt: 3.1. Nó không mở rộng. Trong trường hợp của tôi, số lượng cột tối đa có thể là vài nghìn với chỉ một vài người thực sự cần thiết cho người dùng. 3.2. Đối phó với thay đổi kích thước thực sự là một địa ngục. AFAIU, ngay cả sau khi cột setResizable (false) có thể được thay đổi kích thước nếu thành phần cha được thay đổi kích thước. Để đối phó với nó, tôi cần phải viết những người nghe lớn cho thành phần cha mẹ. Tôi chưa thử.

Vì vậy nên tôi

  1. tra cột bảng xử lý thêm và sử dụng nó?
  2. Ngăn xếp với setWidth (0) trong một thời gian, vì tôi chưa gặp sự cố chia tỷ lệ?
  3. Nhìn theo hướng của một số thành phần bảng bên thứ ba (Nattable ...)? - Nếu có, tốt nhất là nguồn mở, vì trình cắm thêm Eclipse của tôi là mã nguồn mở.

Trả lời

18

Chúng tôi làm điều đó trên nhiều bảng của chúng tôi tại đây.

Trước tiên, chúng tôi đảm bảo người dùng không nhìn thấy những gì chúng tôi đang làm.

table.setRedraw(false); 

Sau đó, chúng tôi xóa tất cả các cột.

while (table.getColumnCount() > 0) { 
    table.getColumns()[ 0 ].dispose(); 
} 

Và sau đó chúng tôi thêm những thứ cần thiết.

ArrayList<Column> columns = getShownColumns(); 

for (Column column : columns) { 
    TableColumn tableColumn = new TableColumn(table, column.getStyle()); 
    tableColumn.setText(column.getTitle()); 
    tableColumn.setWidth(column.getWidth()); 
} 

Và cuối cùng chúng tôi cho phép người dùng xem những gì chúng tôi đã làm.

table.setRedraw(true); 
+0

Bạn không chắc chắn có quyền nhận xét về câu hỏi đã trả lời và đã đóng hay không. ** Nhưng tôi nên làm gì với bố cục? ** Điều duy nhất làm việc cho tôi là TableLayout với số lượng ColumnWeightData hoặc ColumnPIxelData nghiêm ngặt trong đó, nhưng sau khi xóa cột như bạn đã viết - tôi không thể thêm bất kỳ cột nào. –

+0

Tôi không hiểu câu hỏi của bạn. Bạn có thể thể hiện bản thân tốt hơn không? –

+0

Xin lỗi, tôi đã dành một buổi tối khác googling và thấy rằng có TableColumnLayout lớp. Nó làm việc tốt cho tôi. Trên thực tế googling về các công nghệ khác mà tôi sử dụng là một chút dễ dàng hơn. –

3

Tôi chỉ tạo lại các cột trong bảng mỗi lần với các cột hiển thị. Nếu bạn sử dụng bit kiểu SWT.VIRTUAL, điều này sẽ nhanh chóng hợp lý. Đặt table.setRedraw(false), xóa dữ liệu khỏi Bảng của bạn, bỏ tất cả các TableColumn, tạo lại các bảng cần thiết và đặt lại dữ liệu của bạn. Sau đó đặt table.setRedraw(true). Điều này giảm thiểu nhấp nháy.

Tôi đã làm tất cả điều này, nó hoạt động tốt, việc xử lý các TableColumn hoạt động như mong đợi.

Sử dụng SWT.VIRTUAL không dành cho những người yếu tim. Nó liên quan đến việc xử lý bảng khác nhau của bạn. Bạn có thể thử mà không có đầu tiên, để xem nếu nó là đủ nhanh.

Có một bảng có hàng nghìn cột và chỉ hiển thị một số ít cho người dùng có vẻ rất lạ đối với tôi. Với việc triển khai Table gốc tôi mong đợi các vấn đề với điều đó.