原文来自:Snippet8
SWT中的树可以利用SWT.Expand事件实现懒加载。
public class Snippet8 {
public static void main (String [] args) {
final Display display = new Display ();
final Shell shell = new Shell (display);
shell.setText ("Lazy Tree");
shell.setLayout (new FillLayout ());
final Tree tree = new Tree (shell, SWT.BORDER);
File [] roots = File.listRoots ();
for (int i=0; i<roots.length; i++) {
TreeItem root = new TreeItem (tree, 0);
root.setText(roots[i].toString());
root.setData(roots[i]);
// display '+' default.
new TreeItem(root, 0);
}
tree.addListener(SWT.Expand, new Listener () {
public void handleEvent (final Event event) {
final TreeItem root = (TreeItem) event.item;
TreeItem[] items = root.getItems ();
for(int i= 0; i<items.length; i++) {
// if have added children for the item, just return.
if(items[i].getData() != null)
return;
items[i].dispose();
}
File file = (File) root.getData();
File[] files = file.listFiles();
// disc return
if(files == null) return;
for(int i= 0; i<files.length; i++) {
TreeItem item = new TreeItem(root, 0);
item.setText(files[i].getName());
item.setData(files[i]);
if(files[i].isDirectory()) {
// display '+' only for directory.
new TreeItem(item, 0);
}
}
}
});
Point size = tree.computeSize(300, SWT.DEFAULT);
int width = Math.max(300, size.x);
int height = Math.max(300, size.y);
shell.setSize (shell.computeSize (width, height));
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
保证根节点的+图像 写道
// display '+' default.
new TreeItem(root, 0);
new TreeItem(root, 0);
不重复加载 写道
// if have added children for the item, just return.
if(items[i].getData() != null)
return;
if(items[i].getData() != null)
return;

本文介绍了如何在SWT中利用Expand事件实现树形控件的懒加载,通过遍历文件系统并按需加载子项,有效减少内存消耗。
350

被折叠的 条评论
为什么被折叠?



