Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按“如何停止扩展无限SWT树”*&引用;_Java_Windows_Swt - Fatal编程技术网

Java 按“如何停止扩展无限SWT树”*&引用;

Java 按“如何停止扩展无限SWT树”*&引用;,java,windows,swt,Java,Windows,Swt,我的应用程序中有一个SWT树,它包含一个无限的数据结构。展开项目后,我将生成其子项。但在Windows上,用户可以按“*”,触发“展开所有子体”操作,我的应用程序将挂起 当用户按下“*”时,有两种可接受的行为: 展开选定图元的所有子级,但仅展开到下一级 无所事事 在这两种情况下,我仍然需要能够根据需要展开项目(通过单击[+]图标或按“+”),因此限制树深度不是一个解决方案。有没有其他方法可以在不修改SWT类的情况下实现上述任何一种功能?我已经做到了这一点——也许它可以帮助某些人: import

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

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

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

    我已经做到了这一点——也许它可以帮助某些人:

    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();
        }
    }
    
    它所做的是展开第一个元素,然后进入“不会展开更多”模式,只要释放一个键或鼠标按钮,该模式就会被提升。但是,出于某种原因,它会扩展我新生成的项目

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

    我已经走到了这一步——也许它能帮助某些人:

    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();
        }
    }
    
    它所做的是展开第一个元素,然后进入“不会展开更多”模式,只要释放一个键或鼠标按钮,该模式就会被提升。但是,出于某种原因,它会扩展我新生成的项目

    我希望有人有更好的解决办法