首先,我们先构建一棵最简单的树。分为两步:
1. 构建一个Tree对象
2. 为这个Tree对象添加节点
package org.vhow.swt.tree;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class SimplestTree
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
// Construct a Tree object
final Tree tree = new Tree(shell, SWT.BORDER);
// Add sub node to the tree
for (int i = 0; i < 3; i++)
{
TreeItem temp = new TreeItem(tree, SWT.NONE);
temp.setText("root-" + (char) ('a' + i));
new TreeItem(temp, SWT.NONE).setText("sub of " + temp.getText());
}
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
以上代码就已经创建了一棵树,结构如下:
接下来,我们尝试编写一个具有实际用处的Demo。我用树形结构来显示某一指定文件夹下的所有文件及其子文件,这里涉及到的一个问题就是我们何时为文件夹添加子节点。为了提高效率,我们讲监听这个Tree,在其某一父节被展开时我们再为其添加子节点。
package org.vhow.swt.tree;
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class BrowseFileTree
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
// Construct a Tree object.
final Tree tree = new Tree(shell, SWT.BORDER);
File rootFile = new File("/home/null");
// Add root file to the tree.
TreeItem root = new TreeItem(tree, SWT.NONE);
// Set the text displayed on the tree node.
root.setText(rootFile.getName());
// Set the data type of the tree node.
root.setData(rootFile);
// Add a empty sub-node to make the node can be expanded.
new TreeItem(root, SWT.NONE);
tree.addListener(SWT.Expand, new Listener()
{
@Override
public void handleEvent(Event event)
{
// Get the event-source
TreeItem root = (TreeItem) event.item;
// Dispose the empty node
TreeItem[] items = root.getItems();
for (TreeItem item : items)
{
if (item.getData() == null)
{
item.dispose();
}
}
File rootFile = (File) root.getData();
File[] files = rootFile.listFiles();
for (File file : files)
{
if (file.getName().startsWith("."))
{
continue;
}
TreeItem item = new TreeItem(root, SWT.NONE);
item.setText(file.getName());
item.setData(file);
if (file.isDirectory())
{
// Add a empty sub-node to make the node can be
// expanded.
System.out.println(file.getAbsolutePath());
new TreeItem(item, SWT.NONE);
}
}
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
运行以上代码所构建的树如下:
有的时候,我们还需要为我们的Tree加一个CheckBox,当某个节点被Check的时候,它的所有子节点和父节点也随之改变状态。下面的这段代码就实现了这个功能:
package org.vhow.swt.tree;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class CheckableTree
{
private static void checkChildren(TreeItem item, boolean state)
{
item.setChecked(state);
TreeItem[] items = item.getItems();
for (TreeItem treeItem : items)
{
checkChildren(treeItem, state);
}
}
private static void checkParents(TreeItem item, boolean state)
{
item.setChecked(state);
TreeItem parent = item.getParentItem();
if (parent != null)
{
parent.setChecked(state);
checkParents(parent, state);
}
}
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final Tree tree = new Tree(shell, SWT.BORDER | SWT.CHECK);
for (int i = 0; i < 3; i++)
{
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText("item-" + i);
for (int j = 0; j < 2; j++)
{
TreeItem treeItem = new TreeItem(item, SWT.NONE);
treeItem.setText("item-" + i + "-" + j);
new TreeItem(treeItem, SWT.NONE).setText("item-" + i + "-" + j
+ "-" + String.valueOf(0));
}
}
tree.addListener(SWT.Selection, new Listener()
{
@Override
public void handleEvent(Event event)
{
if (event.detail == SWT.CHECK)
{
TreeItem item = (TreeItem) event.item;
boolean state = item.getChecked();
checkChildren(item, state);
checkParents(item, state);
}
}
});
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
实现的效果如下: