实现自定义转换程序
再回到示例上来,假设客户机已经要求将外观普通的 Married 复选框更改为包含 “Yes” 和 “No” 的文字的组合框,如图 7 所示。
图 7. 带有组合框而不是复选框的 UI 示例
但是,请不要忘记复选框是被绑定到 enableYearsMarried
属性上的,该属性属于 boolean
类型。一端的 String
和另一端的 boolean
类型不匹配。在这就非常适合放置一个转换程序。
虽然可以编写针对本教程中其余部分中展示的功能的测试,但是本示例将侧重于实现。对于测试仅做为了保持 ContactPresentationModelTest
所需的更改。但是,在开发环境中,编写测试始终是个很好的做法。
创建一个名为 BooleanToStringConverter
的新类。对于新类的 fromType
,返回 Boolean.TYPE
;对于新类的 toType
,返回 String.class
。在 convert()
方法中,将对象指定为 Boolean,并且如果为 true 则返回 Yes;如果为 false 则返回 No。现在,通过创建类 StringToBooleanConverter
,创建相应的转换程序。交换转换源和转换目标的类型,并将 convert()
方法改为如果值为 Yes,则返回 true;如果值为 No 则返回 false。Java 5 自动装箱负责对象转换。
接下来,需要更改 UI。删除与复选框相关联的代码并将其替换为清单 14 中的代码。此清单还包含对 bindGUI()
方法的替换绑定方法调用。回想第 2 部分中,组合框小部件有一个选项属性可供绑定。绑定行还为 BindSpec
类使用了另一个构造函数,该类允许指定 BooleanToStringConverter
和 StringToBooleanConverter
的使用量。
清单 14. 用组合框替换复选框
gridData = new GridData(GridData.FILL_HORIZONTAL); this.comboIsMarried = new Combo(c, SWT.BORDER); this.comboIsMarried.setLayoutData(gridData); this.comboIsMarried.add("Yes"); this.comboIsMarried.add("No"); . . . ctx.bind(new Property(comboIsMarried, SWTProperties.SELECTION), new Property(presentationModel, "enableYearsMarried"), new BindSpec(new BooleanToStringConverter(), new StringToBooleanConverter(), null, null)); |