2010-11-02 29 views
5

Vấn đề: Tôi cần Bảng SWT (JFace TableViewer) với chiều cao hàng biến đổi. Trong thực tế, tôi đã giải quyết vấn đề này trên máy phát triển của mình (chạy Ubuntu 10.10). Thật không may, điều này không hoạt động trên Windows cũng như trên Mac.Bảng SWT với chiều cao hàng biến: Làm việc trên Linux, nhưng không phải Mac/Windows

Ban đầu, tôi nghĩ rằng tôi đã không sử dụng thư viện chính xác. Nhưng bây giờ tôi sợ rằng những gì tôi muốn làm chỉ đơn giản là không thể trên Windows. Tôi hy vọng một người nào đó ở đây thuyết phục tôi bằng cách khác.

Để tái sản xuất: thay vì cung cấp mã của tôi ở đây, tôi đã xây dựng một chương trình tối thiểu để tái tạo sự cố. Tôi bắt đầu với Snipplet sau:

http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java

tôi sửa đổi phương pháp cập nhật() để tạo ra hai dòng văn bản cho các thư mục và một dòng cho các tập tin (để mô phỏng một môi trường với chiều cao dòng biến):

... 
if (file.isDirectory()) { 
    cell.setText(styledString.toString() + "\n" 
     + styledString.toString()); 
    cell.setImage(IMAGE1); 
} else { 
    cell.setImage(IMAGE2); 
} 
...

Điều này hoạt động như dự định trên Linux, nhưng trên Windows tất cả các hàng có cùng chiều cao. Cụ thể, chỉ có một dòng được hiển thị.

Tiếp theo, tôi đã cố gắng giúp SWT bằng cách làm cho phép đo() thông minh hơn. Vì vậy, tôi viết lại biện pháp() như sau:

protected void measure(Event event, Object element) { 
    if (((File) element).isDirectory()) { 
     event.height = 32; 
    } else { 
     event.height = 16; 
    } 
    super.measure(event, element); 
}

Kết quả: Tất cả các hàng đều có chiều cao 32. Một lần nữa, điều này hoạt động như dự định trên Linux.

Nỗi sợ của tôi là, trên Windows, tất cả các hàng phải có cùng chiều cao. Đây sẽ là một showstopper cho tôi. Ai có thể xác nhận điều này, hoặc thậm chí tốt hơn, cung cấp một workaround?

Cảm ơn!

+0

Thực ra, tôi có thể đã tìm thấy một lời giải thích cho hành vi này, và thậm chí có một sửa chữa (tôi vẫn phải cố gắng này ra): https://bugs.eclipse.org/bugs/show_bug .cgi? id = 148039 – jastram

+0

Cảm ơn tất cả các câu trả lời. Tôi đã kết thúc bằng cách sử dụng http://sourceforge.net/projects/agilegrid/, mà cũng thu hút các bảng nguyên bản, như KTable. Đó là một niềm vui để làm việc với, chắc chắn so với SWT. – jastram

Trả lời

2

Tôi có thể xác nhận rằng trên các hàng của bảng Win32 chỉ có thể có cùng chiều cao. Xem ví dụ this bug report. Cách khắc phục từ lỗi 148039 làm cho setItemHeight() có thể truy cập được, nhưng điều đó không thay đổi giới hạn này.

4

Tôi cũng gặp vấn đề này - cần một tiện ích bảng SWT có thể hỗ trợ các ô có độ cao khác nhau. Như the.duckman nói, các hàng trong bảng Win32 không thể làm điều này. Chúng tôi đã sử dụng tiện ích KTable. Nó không sử dụng các bảng hệ điều hành gốc.

http://sourceforge.net/projects/ktable/

Nó làm việc tốt cho chúng tôi, nhưng nó có một số kỳ quặc. May mắn là mã nguồn khá dễ sửa đổi cho phù hợp với nhu cầu của bạn.

+0

Điều này thực sự thú vị.Nếu tôi chưa tái cấu trúc với AgileGrid, tôi sẽ thử Ktable. – jastram

1

Chúng tôi sử dụng tiện ích con Nebula Grid. http://www.eclipse.org/nebula/widgets/grid/grid.php

Nó đặc biệt linh hoạt. Trong trường hợp của chúng tôi, chúng tôi sử dụng nó để có thêm nhiều chức năng bảng kiểu html kết hợp với một widget treeViewer.

Ảnh chụp màn hình alt text

+0

Bạn có chắc chắn rằng Tinh vân giải quyết vấn đề này không? Tôi tin rằng tôi đã kiểm tra nó và từ chối nó. Tôi không chắc chắn về thời tiết, tôi đã từ chối nó bởi vì nó nằm trong ALPHA, hoặc bởi vì nó cũng có giới hạn chiều cao hàng. Nhưng tôi nghĩ * đó là do các vấn đề về chiều cao hàng. – jastram

+0

Để có được chiều cao biến không phải là hoàn toàn ra khỏi hộp nhưng nó là rất thẳng về phía trước. Mỗi hàng trong Grid có thuộc tính chiều cao độc lập riêng. Vì vậy, như trên sơn/đo lường trong một bảng bình thường phụ tùng bạn có thể điều chỉnh chiều cao nhưng tất cả các tableitems bây giờ là chiều cao tối đa trong lưới bạn có thể điều chỉnh từng GridItem.setHeight(). Trong trường hợp của tôi, tôi đang sử dụng trình xem bảng lưới và phương thức cập nhật nhà cung cấp nhãn của tôi tính toán chiều cao thích hợp cho mỗi hàng. Đó là bản Beta nhưng đã rất ổn định đối với chúng tôi trong hơn 2 năm qua. – fisherja

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