按“*”后如何停止扩展无限SWT树

时间:2010-06-10 13:19:14

标签: java windows swt

我的应用程序中有一个包含无限数据结构的SWT树。在扩展项目时,我会生成其子项。在Windows上,用户可以按“*”,触发“展开所有后代”操作,我的应用程序挂起。

当用户按下“*”时,我有两种可接受的行为:

  1. 展开所选元素的所有子元素,但仅扩展到下一个级别
  2. 什么都不做
  3. 在任何一种情况下,我仍然需要能够根据需要扩展项目(通过单击[+]图标或按“+”),因此限制树深度不是解决方案。有没有其他方法可以在不修改SWT类的情况下实现上述任何一种方法?

1 个答案:

答案 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();
    }
}

它的作用是扩展第一个元素,然后进入“不会扩展更多”模式,只要释放按键或鼠标按钮,该模式就会被提升。但是,出于某种原因,它会扩展我新生成的项目。

我希望有人有更好的解决方案。