Eclipse设计实现可重用的SWT构件
2007-11-19 10:44:36 来源:论坛整理 作者:翁长河 点击:
本文从创建一个简单的SWT Tree Table开始,引入可重用的用户界面构件这个开发人员普遍关心的问题,然后分析Eclipse的用户界面的一些设计模式,循序渐进的向读者展示了如何设计实现一个精巧的高度可重用的TreeTable构件,最终通过增加一些扩展的功能显示了该构件强大的可扩展能力和灵活性。
清单3则展示了如何使用EmployeeContentProvider和EmployeeLabelProvider创建一个TreeTable的示例窗口。
清单3:SimpleTestWindow的代码。
public class SimpleTestWindow extends ApplicationWindow {
private TableTreeViewer ttv;
public SimpleTestWindow() {
super(null);
}
public void run() {
setBlockOnOpen(true);
open();
Display.getCurrent().dispose();
}
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText("Simple Tree Table Test");
}
protected Control createContents(Composite parent) {
ttv = new TableTreeViewer(parent);
ttv.getTableTree().setLayoutData(new GridData(GridData.FILL_BOTH));
ttv.setContentProvider(new EmployeeContentProvider());
ttv.setLabelProvider(new EmployeeLabelProvider());
ttv.setInput(TestDataGenerator.getTestDepartments());
// Set up the table
Table table = ttv.getTableTree().getTable();
new TableColumn(table, SWT.LEFT).setText("Name");
new TableColumn(table, SWT.LEFT).setText("Job Title");
new TableColumn(table, SWT.RIGHT).setText("Phone");
new TableColumn(table, SWT.RIGHT).setText("Birthday");
for (int i = 0, n = table.getColumnCount(); i < n; i++) {
table.getColumn(i).pack();
}
table.setHeaderVisible(true);
table.setLinesVisible(true);
parent.pack();
ttv.reveal(ttv.getElementAt(0));
return ttv.getTableTree();
}
public static void main(String[] args) {
new SimpleTestWindow().run();
}
} |
图2展示了运行SimpleTestWindow后所显示的TreeTable的效果,所有的代码我们已经打包进附件中的test_1.0.0.jar,模型部分代码见test.model包,测试代码见test.simple包。
图2:SimpleTestWindow的运行结果

这样的设计似乎非常的符合MVC设计模式(参见《设计模式:可复用面向对象软件的基础》),模型是Department数组,视图是一个Tree,TableTreeViewer 的EmployeeLabelProvider和EmployeeContentProvider联合充当了控制器的角色,Department决定显示哪些东西,EmployeeLabelProvider决定如何显示(表格的内容和图标)。然而只要回顾以往项目的经验,我们很快就给自己提出了一些问题。
可重用问题的提出
虽然上面的示例中SWT的这种设计模式看上去很优美,然而经验使我们对EmployeeLabelProvider