需求: 一棵多列树形,每次展开(或收起)操作后,重新设置各列宽,让其文本可以完全显示。 问题: 目前,TreeColumn提供了pack()方法来实现此功能; 但是经试验,对于首列(即有树形的列)来说,此方法计算的列宽不对,会有一部分节点的文本显示不全(貌似是SWT的BUG)。
请教一下,大家遇到这个问题的时候,是怎么解决的? ===========================================
import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.TreeColumn;
public class TreeColumnAutoSizeListener implements ITreeViewerListener {
/** * 节点展开事件. */ public void treeExpanded(TreeExpansionEvent event) { packColumns((TreeViewer) event.getSource()); }
/** * 节点折叠事件. */ public void treeCollapsed(TreeExpansionEvent event) { packColumns((TreeViewer) event.getSource()); }
/** * 自动包装列宽度. * * @param treeViewer * TreeViewer */ private void packColumns(final TreeViewer treeViewer) { // 更新界面,要异步执行 treeViewer.getControl().getShell().getDisplay() .asyncExec(new Runnable() { public void run() { TreeColumn[] treeColumns = treeViewer.getTree() .getColumns(); for (TreeColumn treeColumn : treeColumns) { if (treeColumn.getWidth() == 0) continue;
treeColumn.pack(); } } }); } }
使用的时候: viewer.addTreeListener(new TreeColumnAutoSizeListener()); 就行了。
|