gpt4 book ai didi

java - 项目展开时自动调整列的大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:10 24 4
gpt4 key购买 nike

在具有多列的树中,如何在展开/折叠和数据更新时根据内容调整列的大小?

类似question for tables的解决方法不起作用。

同于:

  tree.addListener(SWT.Collapse, new Listener(){
@Override
public void handleEvent(Event e) {
expandAndResize(false, (TreeItem) e.item);
}
});

tree.addListener(SWT.Expand, new Listener() {
@Override
public void handleEvent(Event event) {
expandAndResize(false, (TreeItem) event.item);
}
});

private static void expandAndResize(Boolean expand_, TreeItem item_)
{
System.out.println( (expand_?"Expanding":"Collapsing") + "item={" + item_ + "}");
item_.setExpanded(expand_);
System.out.println(" Resizing columns");
resizeTree(item_.getParent());
}

private static void resizeTree(Tree tree_)
{
for (TreeColumn tc: tree_.getColumns())
resizeTreeColumn(tc);
}

private static void resizeTreeColumn(TreeColumn treeColumn_)
{
treeColumn_.pack();
}

这适用于数据更新(通过调用 resizeTree),但对于展开/折叠它落后了一步!

更具体地说,如果我在第一列中展开一个项目,并且下面的项目比列宽长,那么将在下一次折叠或展开其他项目时调整到该宽度(或者如果我直接调用 resizeTree)。

以防万一它很重要:数据由 TreeContentProviderITableLabelProvider 给出,我的猜测是 ITableLabelProvider 可能导致问题(在生成标签之前调整列的宽度?!)

X-posted to Eclipse Community Forum

最佳答案

A snippet显示您的问题会使这更容易。

要解决此问题,您只需将监听器的代码放入 asyncExec block 中,以推迟其执行。 (我有一种似曾相识的感觉,因为我最近用同样的提示回答了另一个问题......)

顺便说一句:您不必调用 TreeItem.setExpanded(.)。另外,当你有原始类型时,不要使用 boolean 值。它可以工作,但 VM 一直进行自动装箱,这对性能不利。这在这里无关紧要,但这是一个坏习惯。然后:变量的下划线后缀?

现在是工作片段,取自并改编自 here :

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class Snippet {

public static void main( String[] args ) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Tree tree = new Tree(shell, SWT.BORDER);
tree.setHeaderVisible(true);
TreeColumn col1 = new TreeColumn(tree, 0);
col1.setText("col1");
TreeColumn col2 = new TreeColumn(tree, 0);
col2.setText("col2");

for ( int i = 0; i < 4; i++ ) {
TreeItem iItem = new TreeItem(tree, 0);
iItem.setText(new String[] { "TreeItem (0) -" + i, "x" });
for ( int j = 0; j < 4; j++ ) {
TreeItem jItem = new TreeItem(iItem, 0);
jItem.setText(new String[] { "TreeItem (1) -" + i, "x" });
for ( int k = 0; k < 4; k++ ) {
TreeItem kItem = new TreeItem(jItem, 0);
kItem.setText(new String[] { "TreeItem (2) -" + i, "x" });
for ( int l = 0; l < 4; l++ ) {
TreeItem lItem = new TreeItem(kItem, 0);
lItem.setText(new String[] { "TreeItem (3) -" + i, "x" });
}
}
}
}

col1.pack();
col2.pack();

Listener listener = new Listener() {

@Override
public void handleEvent( Event e ) {
final TreeItem treeItem = (TreeItem)e.item;
display.asyncExec(new Runnable() {

@Override
public void run() {
for ( TreeColumn tc : treeItem.getParent().getColumns() )
tc.pack();
}
});
}
};

tree.addListener(SWT.Collapse, listener);
tree.addListener(SWT.Expand, listener);

shell.setSize(200, 200);
shell.open();
while ( !shell.isDisposed() ) {
if ( !display.readAndDispatch() ) display.sleep();
}
display.dispose();
}
}

关于java - 项目展开时自动调整列的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3195601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com