Java 按“如何停止扩展无限SWT树”*&引用;
我的应用程序中有一个SWT树,它包含一个无限的数据结构。展开项目后,我将生成其子项。但在Windows上,用户可以按“*”,触发“展开所有子体”操作,我的应用程序将挂起 当用户按下“*”时,有两种可接受的行为:Java 按“如何停止扩展无限SWT树”*&引用;,java,windows,swt,Java,Windows,Swt,我的应用程序中有一个SWT树,它包含一个无限的数据结构。展开项目后,我将生成其子项。但在Windows上,用户可以按“*”,触发“展开所有子体”操作,我的应用程序将挂起 当用户按下“*”时,有两种可接受的行为: 展开选定图元的所有子级,但仅展开到下一级 无所事事 在这两种情况下,我仍然需要能够根据需要展开项目(通过单击[+]图标或按“+”),因此限制树深度不是一个解决方案。有没有其他方法可以在不修改SWT类的情况下实现上述任何一种功能?我已经做到了这一点——也许它可以帮助某些人: import
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();
}
}
它所做的是展开第一个元素,然后进入“不会展开更多”模式,只要释放一个键或鼠标按钮,该模式就会被提升。但是,出于某种原因,它会扩展我新生成的项目
我希望有人有更好的解决办法