首先我使用SWT中的TreeViewer類畫了一棵簡單樹。
代碼如下:
package net.blogjava.lzqdiy.tree;

import java.util.List;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;

public class TreeTest


{

class TreeLabelProvider extends LabelProvider

{
public String getText(Object element)

{
ITreeEntry entry = (ITreeEntry) element;
return entry.getName();
}

public Image getImage(Object element)

{
return null;
}
}

class TreeContentProvider implements IStructuredContentProvider,
ITreeContentProvider

{
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)

{
}

public void dispose()

{
}

public Object[] getElements(Object inputElement)

{
if (inputElement instanceof List)

{
List list = (List) inputElement;
return list.toArray();
} else
return new Object[0];
}

public Object[] getChildren(Object parentElement)

{
ITreeEntry entry = (ITreeEntry) parentElement;
List list = entry.getChildren();
if (list == null || list.isEmpty())

{
return new Object[0];
} else
return list.toArray();
}

public Object getParent(Object element)

{
return null;
}

public boolean hasChildren(Object element)

{
ITreeEntry entry = (ITreeEntry) element;
List list = entry.getChildren();
if (list == null || list.isEmpty())

{
return false;
} else
return true;
}
}

private Tree tree;


/** *//**
* Launch the application
*
* @param args
*/
public static void main(String[] args)

{
try

{
TreeTest window = new TreeTest();
window.open();
} catch (Exception e)

{
e.printStackTrace();
}
}


/** *//**
* Open the window
*/
public void open()

{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(350, 250);
shell.setText("SWT Application");
//

shell.open();

final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER);
treeViewer.setLabelProvider(new TreeLabelProvider());
treeViewer.setContentProvider(new TreeContentProvider());
Object inputObj = DataFactory.createTreeData();
treeViewer.setInput(inputObj);
tree = treeViewer.getTree();
tree.setBounds(66, 44, 268, 165);
shell.layout();
while (!shell.isDisposed())

{
if (!display.readAndDispatch())
display.sleep();
}
}
}

package net.blogjava.lzqdiy.tree;

import java.util.List;

public interface ITreeEntry


{
String getName();
void setName(String name);
void setChildren(List children);
List getChildren();
}

package net.blogjava.lzqdiy.tree;

import java.util.List;

public class CityEntity implements ITreeEntry


{
public List getChildren()

{
// TODO Auto-generated method stub
return null;
}

public void setChildren(List children)

{
// TODO Auto-generated method stub
}
private long id;

String name;

public long getId()

{
return id;
}

public void setId(long id)

{
this.id = id;
}

public String getName()

{
return name;
}

public void setName(String name)

{
this.name = name;
}

public CityEntity(String name)

{
super();
this.name = name;
}
}

package net.blogjava.lzqdiy.tree;

import java.util.List;

public class CountryEntity implements ITreeEntry


{
public List getChildren()

{
// TODO Auto-generated method stub
return cities;
}

public void setChildren(List children)

{
// TODO Auto-generated method stub
this.cities=children;
}
private Long id;

private String name;

private List cities;

public List getCities()

{
return cities;
}

public void setCities(List cities)

{
this.cities = cities;
}

public Long getId()

{
return id;
}

public void setId(Long id)

{
this.id = id;
}

public String getName()

{
return name;
}

public void setName(String name)

{
this.name = name;
}

public CountryEntity(String name)

{
super();
this.name = name;
}
}

package net.blogjava.lzqdiy.tree;

import java.util.ArrayList;
import java.util.List;

public class DataFactory


{
public static Object createTreeData()

{
CityEntity city1 = new CityEntity("北京");
CityEntity city2 = new CityEntity("上海");
CityEntity city3 = new CityEntity("廣州");
CountryEntity country = new CountryEntity("中國");
List cities = new ArrayList();
cities.add(city1);
cities.add(city2);
cities.add(city3);
country.setChildren(cities);
List list = new ArrayList();
list.add(country);
return list;
}
}

運行效果:

如果我只需要能畫出如上圖所示的一棵簡單樹,使用TreeViewer卻要寫如此多的代碼,實在是得不償失。這時使我想到了使用Swing中的JTree類。
代碼如下:
package net.blogjava.lzqdiy.tree;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class TreeTest2


{

private JTree tree;

private JFrame frame;


/** *//**
* Launch the application
*
* @param args
*/
public static void main(String args[])

{
try

{
TreeTest2 window = new TreeTest2();
window.frame.setVisible(true);
} catch (Exception e)

{
e.printStackTrace();
}
}


/** *//**
* Create the application
*/
public TreeTest2()

{
initialize();
}


/** *//**
* Initialize the contents of the frame
*/
private void initialize()

{
frame = new JFrame();
frame.getContentPane().setLayout(null);
frame.setBounds(100, 100, 400, 275);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DefaultMutableTreeNode country = new DefaultMutableTreeNode("中國");
DefaultMutableTreeNode city1 = new DefaultMutableTreeNode("北京");
DefaultMutableTreeNode city2 = new DefaultMutableTreeNode("上海");
DefaultMutableTreeNode city3 = new DefaultMutableTreeNode("廣州");
country.add(city1);
country.add(city2);
country.add(city3);
tree = new JTree(country);
tree.setBounds(113, 76, 222, 120);
frame.getContentPane().add(tree);
}
}

運行效果:

雖然代碼變少了,但是感覺用Swing畫出的樹又沒有SWT畫出的樹漂亮,最終我選擇了使用SWT中的Tree類來畫一棵簡單樹。
代碼如下:
package net.blogjava.lzqdiy.tree;

import org.eclipse.swt.SWT;
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 TreeTest3


{

private Tree tree;


/** *//**
* Launch the application
*
* @param args
*/
public static void main(String[] args)

{
try

{
TreeTest3 window = new TreeTest3();
window.open();
} catch (Exception e)

{
e.printStackTrace();
}
}


/** *//**
* Open the window
*/
public void open()

{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(350, 250);
shell.setText("SWT Application");
//

shell.open();

tree = new Tree(shell, SWT.BORDER);
tree.setBounds(65, 39, 208, 121);
TreeItem country = new TreeItem(tree, SWT.NONE);
country.setText("中國");
TreeItem city1 = new TreeItem(country, SWT.NULL);
city1.setText("北京");
TreeItem city2 = new TreeItem(country, SWT.NULL);
city2.setText("上海");
TreeItem city3 = new TreeItem(country, SWT.NULL);
city3.setText("廣州");
shell.layout();
while (!shell.isDisposed())

{
if (!display.readAndDispatch())
display.sleep();
}
}
}

運行效果:

又漂亮,代碼量又少,我喜歡,呵呵。