上邊介紹了,tableviewer,這里介紹一下treeViewer,總的流程類似。
一、構造一個樹形結構的數據出來,這里選擇國家、城市、人來構造一個樹形結構,代碼如下:
1,定義一個接口
package model;

import java.util.List;


public interface Itree
{
public String getName();
public void setName(String name);
public void setChildren(List Children);
public List getChildren();
}

2,國家
package model;

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


public class Country implements Itree
{
private Long id;
private String name;
private List children = new ArrayList();

public Country()
{
}

public Country(String name)
{
this.name = name;
}

public List getChildren()
{
return children;
}

public void setChildren(List children)
{
this.children = children;
}

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;
}
}

3,城市
package model;

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


public class City implements Itree
{
private Long id;
private String name;
private List children = new ArrayList();

public City()
{
}

public City(String name)
{
this.name = name;
}

public List getChildren()
{
return children;
}

public void setChildren(List children)
{
this.children = children;
}

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;
}
}

4,人
package model;

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


public class People implements Itree
{
private Long id;
private String name;

public People()
{
}

public People(String name)
{
this.name = name;
}

public List getChildren()
{
return null;
}

public void setChildren(List children)
{
}

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;
}
}

5,把這些元素組織起來
package model;

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


public class Factory
{
@SuppressWarnings("unchecked")

public static List createTree()
{
//生成國家
Country cn = new Country("中國");
Country us = new Country("美國");
Country jp = new Country("日本");
//生成城市
City beijing = new City("北京");
City shanghai = new City("上海");
City newyork = new City("紐約");
City la = new City("洛杉磯");
City tokyo = new City("東京");
City osaka = new City("大阪");
//北京人
ArrayList list = new ArrayList();
list.add(new People("張三"));
list.add(new People("李四"));
list.add(new People("王五"));
beijing.setChildren(list);
//上海人
list = new ArrayList();
list.add(new People("翠花"));
list.add(new People("小紅"));
list.add(new People("小崔"));
shanghai.setChildren(list);
//紐約人
list = new ArrayList();
list.add(new People("tom"));
list.add(new People("rose"));
list.add(new People("john"));
newyork.setChildren(list);
//洛杉磯人
list = new ArrayList();
list.add(new People("Sofia"));
list.add(new People("sarah"));
list.add(new People("Jennifer"));
la.setChildren(list);
//東京人
list = new ArrayList();
list.add(new People("渡邊"));
list.add(new People("鬼冢"));
list.add(new People("山本"));
tokyo.setChildren(list);
//大阪人
list = new ArrayList();
list.add(new People("奈奈子"));
list.add(new People("菜菜子"));
list.add(new People("新垣結衣"));
osaka.setChildren(list);
//關聯城市與國家
//中國
ArrayList citys = new ArrayList();
citys.add(beijing);
citys.add(shanghai);
cn.setChildren(citys);
//美國
citys = new ArrayList();
citys.add(newyork);
citys.add(la);
us.setChildren(citys);
//日本
citys = new ArrayList();
citys.add(tokyo);
citys.add(osaka);
jp.setChildren(citys);
//國家列表
ArrayList countrys = new ArrayList();
countrys.add(cn);
countrys.add(us);
countrys.add(jp);
return countrys;
}
}

二、定義內容器和標簽器
1,內容器
import java.util.List;

import model.Itree;

import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;


public class TreeContentProvider implements IStructuredContentProvider, ITreeContentProvider
{

public Object[] getElements(Object inputElement)
{

if (inputElement instanceof List)
{
List input = (List)inputElement;
return input.toArray();
}
return new Object[0];
}

public Object[] getChildren(Object parentElement)
{
Itree node = (Itree)parentElement;
List list = node.getChildren();

if(list == null)
{
return new Object[0];
}
return list.toArray();
}

public boolean hasChildren(Object element)
{
Itree node = (Itree)element;
List list = node.getChildren();
return !(list == null || list.isEmpty());
}
//以下三個函數根據需要填充

public Object getParent(Object element)
{
return null;
}

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

public void dispose()
{
}
}
2,標簽器:
import model.Itree;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;


public class TreeLabelProvider extends LabelProvider implements ILabelProvider
{

public String getText(Object element)
{
Itree node = (Itree)element;
return node.getName();
}

public Image getImage(Object element)
{
return null;
}
}
三、好了,準備工作做好了,把上邊的內容利用起來就好了。
import model.Factory;

import org.eclipse.jface.viewers.TreeViewer;
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;



public class TestTreeViewer
{
private static Tree tree;

public static void main(String[] args)
{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
//
final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);
tree = treeViewer.getTree();
tree.setBounds(83, 75, 264, 185);
treeViewer.setLabelProvider(new TreeLabelProvider());
treeViewer.setContentProvider(new TreeContentProvider());
treeViewer.setInput(Factory.createTree());
shell.open();
shell.setLayout(new FillLayout());
shell.layout();

while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
}

}

看看是不是已經實現了treeViewer
四、上邊是簡單的treeViewer,如果我們需要帶checkbox的treeViewer,簡單,只需要更改
final TreeViewer treeViewer = new TreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);

把TreeViewer換成CheckboxTreeViewer。這就是mvc的好處了。
但現實中我們多用ContainerCheckedTreeViewer代替CheckboxTreeViewer,因為這個提供了更多的功能。
CheckboxTreeViewer是TreeViewer的子類, ContainerCheckedTreeViewer是CheckboxTreeViewer的子類,所以可以隨便替換。
替換后:
final ContainerCheckedTreeViewer treeViewer = new ContainerCheckedTreeViewer(shell, SWT.BORDER|SWT.H_SCROLL);
五、treeviewer和tableviewer都介紹過了,考慮一下把兩個結合起來是不是我們經常需要的情況。嘗試一下吧。
六、souce下載:
http://www.tkk7.com/Files/dreamstone/jface-6.rar