我的应用程序中有一个包含无限数据结构的SWT树。在扩展项目时,我会生成其子项。在Windows上,用户可以按“*”,触发“展开所有后代”操作,我的应用程序挂起。
当用户按下“*”时,我有两种可接受的行为:
在任何一种情况下,我仍然需要能够根据需要扩展项目(通过单击[+]图标或按“+”),因此限制树深度不是解决方案。有没有其他方法可以在不修改SWT类的情况下实现上述任何一种方法?
答案 0 :(得分:1)
我做到了这一点 - 也许它对某人有所帮助:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class SWTInfiniteTree {
private boolean expanding;
public SWTInfiniteTree() {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
Tree tree = new Tree(shell, SWT.BORDER);
tree.setLayoutData(new GridData(GridData.FILL_BOTH));
createItem(tree, "ITEM1");
createItem(tree, "ITEM2");
createItem(tree, "ITEM3");
tree.addTreeListener(new TreeListener() {
@Override
public void treeExpanded(TreeEvent e) {
TreeItem parent = (TreeItem) e.item;
if (expanding) {
e.doit = false;
} else {
expanding = true;
parent.removeAll();
createItem(parent, ".1");
createItem(parent, ".2");
createItem(parent, ".3");
}
}
@Override
public void treeCollapsed(TreeEvent e) {
}
});
tree.addKeyListener(new KeyListener() {
@Override
public void keyReleased(KeyEvent e) {
expanding = false;
}
@Override
public void keyPressed(KeyEvent e) {
}
});
tree.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
expanding = false;
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseDoubleClick(MouseEvent e) {
expanding = false;
}
});
shell.setSize(300, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private TreeItem createItem(Widget parent, String text) {
TreeItem item;
if (parent instanceof Tree) {
item = new TreeItem((Tree) parent, SWT.NULL);
item.setText(text);
} else {
item = new TreeItem((TreeItem) parent, SWT.NULL);
item.setText(((TreeItem) parent).getText() + text);
}
// So that we have a [+] icon
item.setItemCount(1);
return item;
}
public static void main(String[] args) {
new SWTInfiniteTree();
}
}
它的作用是扩展第一个元素,然后进入“不会扩展更多”模式,只要释放按键或鼠标按钮,该模式就会被提升。但是,出于某种原因,它会扩展我新生成的项目。
我希望有人有更好的解决方案。