SWT带有一组类用来帮助构建Tree界面。其中主要的类有Tree和TreeItem两个类,Tree类表示树的主干,其他项目将会添加到其上,TreeItem代表树上的某个项目(分枝)。
1. 创建Tree
要创建tree的界面,必须创建出Tree的对象并将它加入到Shell或者Composite上:
Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
除了SWT.BORDER外,Tree还支持三种额外的样式:SWT.SINGLE、SWT.MULTI、SWT.CHECK.
2.增加树节点
tree的项目是由TreeItem的对象来表示的,必须对每个想要加到tree上的项目创建出TreeItem对象。
要直接将项目加到tree的主干上,需传入已经创建的Tree对象的引用给TreeItem的构造函数,并传入样式与项目想要出现的位置信息:
TreeItem child1=new TreeItem(t,SWT.NONE,0);
child1.setText("1");
TreeItem child2=new TreeItem(t,SWT.NONE,1);
child1.setText("2");
TreeItem child3=new TreeItem(t,SWT.NONE,2);
child1.setText("3");
要创建其他项目的子项目,传递对作为parent项目的TreeItem的引用、样式与你希望子项目出现的位置给TreeItem的构造函数:
TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
child2a.setText("2A");
TreeItem child2b=new TreeItem(child2,SWT.NONE,0);
child2b.setText("2B");
3.创建完整的Tree范例:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class TreeShell {
Display d;
Shell s;
public TreeShell(){
d=new Display();
s=new Shell(d);
s.setSize(250, 200);
s.setText("Tree example");
s.setLayout(new FillLayout());
//创建具有单选和边框的Tree
Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
//创建主干项目1、2和3
TreeItem child1=new TreeItem(t,SWT.NONE,0);
child1.setText("1");
child1.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child2=new TreeItem(t,SWT.NONE,1);
child2.setText("2");
child2.setImage(new Image(d,"C://100//Fold1.ico"));
//创建子项目的子项目2A和2B
TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
child2a.setText("2A");
child2a.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child2b=new TreeItem(child2,SWT.NONE,1);
child2b.setText("2B");
child2b.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child3=new TreeItem(t,SWT.NONE,2);
child3.setText("3");
child3.setImage(new Image(d,"C://100//Fold1.ico"));
t.addTreeListener(new TreeListener(){
//图像变成被合拢对象时的样子
public void treeCollapsed(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold1.ico"));
}
//图像变成被展开对象所需的样子
public void treeExpanded(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold2.ico"));
}
});
s.open();
while(!s.isDisposed())
if(!d.readAndDispatch())
d.sleep();
d.dispose();
}
public static void main(String args[]){
new TreeShell();
}
}
这个范例展示了创建Tree对象时的过程。不管有多复杂有多少层次,Tree的创建只是重复上述过程代码而已。
4.并用图像与TreeItem
可以使用setImage()来将TreeItem与图像进行关联:
child1.setImage(new Image(d,"C://icons//folder.gif"));
在展开节点时改变图像,需要一个机制来判断项目的状态。SWT提供特别为这些事件所设计的listener类型------TreeListener。以下这段程序可以被用在任何的tree上,只要将已经载入的图像文件替换就可以了。
t.addTreeListener(new TreeListener(){
//图像变成被合拢对象时的样子
public void treeCollapsed(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold1.ico"));
}
//图像变成被展开对象所需的样子
public void treeExpanded(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold2.ico"));
}
});
5. 组合Tree与其他Widget
Windows的资源管理器通过结合Tree与List结构来完成的。下面我们构建一个简单的资源管理器。
在SWT中使用FillLayout加上Tree与List来构建相同类型的界面。
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class TreeShell {
Display d;
Shell s;
public TreeShell(){
d=new Display();
s=new Shell(d);
s.setSize(250, 200);
s.setText("Tree example");
//设置tree和list各占Shell的50%
s.setLayout(new FillLayout(SWT.HORIZONTAL));
//创建具有单选和边框的Tree
Tree t=new Tree(s,SWT.SINGLE|SWT.BORDER);
//创建主干项目1、2和3
TreeItem child1=new TreeItem(t,SWT.NONE,0);
child1.setText("1");
child1.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child2=new TreeItem(t,SWT.NONE,1);
child2.setText("2");
child2.setImage(new Image(d,"C://100//Fold1.ico"));
//创建子项目的子项目2A和2B
TreeItem child2a=new TreeItem(child2,SWT.NONE,0);
child2a.setText("2A");
child2a.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child2b=new TreeItem(child2,SWT.NONE,1);
child2b.setText("2B");
child2b.setImage(new Image(d,"C://100//Fold1.ico"));
TreeItem child3=new TreeItem(t,SWT.NONE,2);
child3.setText("3");
child3.setImage(new Image(d,"C://100//Fold1.ico"));
final List l=new List(s,SWT.BORDER|SWT.SINGLE);
t.addTreeListener(new TreeListener(){
//图像变成被合拢对象时的样子
public void treeCollapsed(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold1.ico"));
}
//图像变成被展开对象所需的样子
public void treeExpanded(TreeEvent e) {
TreeItem ti=(TreeItem)e.item;
ti.setImage(new Image(d,"C://100//Fold2.ico"));
}
});
t.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e){
TreeItem ti=(TreeItem)e.item;
populateList(ti.getText());
}
//处理用户选取节点的事件,在具体应用中,可以通过数据库选择项目,此处只是简单的例子。
private void populateList(String text) {
if(text.equals("1"))
{
l.removeAll();
l.add("File1");
l.add("File2");
}
if(text.equals("2"))
{
l.removeAll();
}
if(text.equals("2A"))
{
l.removeAll();
l.add("File3");
l.add("File4");
}
if(text.equals("2B"))
{
l.removeAll();
l.add("File5");
l.add("File6");
}
if(text.equals("3"))
{
l.removeAll();
l.add("File7");
l.add("File8");
}
}
});
s.open();
while(!s.isDisposed())
if(!d.readAndDispatch())
d.sleep();
d.dispose();
}
public static void main(String args[]){
new TreeShell();
}
}
6. 运用其它的Tree样式
SWT.MULTI创建出可以让用户作出多重选取的tree。SWT.CHECK样式的Tree会产生checkbox的Tree。如果使用了SWT.CHECK的样式,就需要判断哪些项目被选取了。通过调用TreeItem的getChecked()来判断某个项目是否被checked。下面的程序在循环中判断每个TreeItem的状态:
TreeItem[] tia=t.getItems();
for(int i=0;i<tia.length;i++){
if(tia[i].getChecked()){
System.out.print("Checked");
}
TreeItem []child=tia[i].getItems();
for(int n=0;n<child.length;n++)
if(child[n].getChecked())
System.out.print("Checked");
}
以上的代码只能用在仅有一层子项目的tree上。多层的tree需要循环运算来处理。
SWT.CHECK样式的Tree对象在你需要让用户对Tree作出多重选取但又不想要SWT.MULTI模式的额外成本的时候是合适的(但若是要使用选取出的TreeItem来采取某些像是产生list内容这样的动作时则不适用)。
3897

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



