SWT - Tree

首先,我们先构建一棵最简单的树。分为两步:

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();
 }
}
实现的效果如下:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值