Eclipse设计实现可重用的SWT构件
2007-11-19 10:44:36 来源:论坛整理 作者:翁长河 点击:
本文从创建一个简单的SWT Tree Table开始,引入可重用的用户界面构件这个开发人员普遍关心的问题,然后分析Eclipse的用户界面的一些设计模式,循序渐进的向读者展示了如何设计实现一个精巧的高度可重用的TreeTable构件,最终通过增加一些扩展的功能显示了该构件强大的可扩展能力和灵活性。
表的4个列控制器,每个Field的getColumnHeaderText就控制该列的显示,我们依次实现了NameField、TitleField、PhoneField和BirthField。读者可以参考NameField的代码,详细代码请见附件。
清单10:NameField的代码
public class NameField extends AbstractField {
public String getColumnHeaderText() {
return "Name";
}
public String getValue(Object object ) {
if(object instanceof Employee)
return ((Employee)object).getName();
else if(object instanceof Department)
return ((Department)object).getName();
else
return "";
}
} |
同时我们需要实现一个适配器EmployeeTreeTableAdapter来控制TreeTable行的行为,这里因为行之间的行为比较简单,我们只要使用一个适配器就能应付需求,如果有更复杂的需求,我们可以轻易的使用新的适配器,来扩展TreeTable行控制能力。清单11给出EmployeeTreeTableAdapter的代码。
清单11: EmployeeTreeTableAdapter的代码
public class EmployeeTreeTableAdapter extends DefaultTreeTableAdapter {
public static EmployeeTreeTableAdapter instance=new EmployeeTreeTableAdapter();
private EmployeeTreeTableAdapter(){}
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof Department&&((Department)parentElement).getManagers()!=null)
return ((Department)parentElement).getManagers().toArray();
else if(parentElement instanceof Manager&&((Manager)parentElement).getEmployees()!=null)
return ((Manager)parentElement).getEmployees().toArray();
else
return new Object[0];
}
} |
注意,这里我们返回new Object[0] 而不是null,可以避免引起不必要的判空。 此时,测试代码也变得简单多了(说明实际的开发代码将更为简单),如清单12所示。
清单12:TreeTable的测试代码
public class TestWindow extends ApplicationWindow {
public TestWindow() {
super(null);
}
public void run() {
setBlockOnOpen(true);
open();
Display.getCurrent().dispose();
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Reusable Tree Table Test");
}
protected Control createContents(Composite parent) {
IField[] fields = new IField[] { new NameField(), new TitleField(),
new PhoneField(), new BirthField() };
TreeTable treeTable= new TreeTable(parent, SWT.BORDER ,fields,
new FixedTreeTableAdapterFactory(EmployeeTreeTableAdapter.instance) );
treeTable.setInput(TestDataGenerator.getTestDepartments());
return treeTable.getTree();
}
public static void main(String[] args) {
new TestWindow().run();
}
} |