实现自定义转换程序
再回到示例上来,假设客户机已经要求将外观普通的 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));
|
本文介绍如何通过创建自定义转换程序解决UI元素与后端数据类型的不匹配问题,包括从布尔值到字符串及反之的转换过程。
531

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



