我继承了一个使用JGoodies Binding将域模型连接到GUI的项目。但是,我发现有一些不一致的地方也会造成一些错误。
在这个具体案例中,GUI由两个单选按钮和一个标签表示。根据选择的按钮,标签应显示特定图像。按钮绑定到不同的枚举值,如下所示:
AbstractValueModel enumSelectionModel = presentationModel.getModel("selection");
radioBtn1 = BasicComponentFactory.createRadioButton(enumSelectionModel,
Selection.selection1, "");
radioBtn2 = BasicComponentFactory.createRadioButton(enumSelectionModel,
Selection.selection2, "");
"selection"
是绑定属性,Selection
是Enum,这意味着当更改其他按钮时,我的模型中的selection
属性将设置为相应的Enum值
我的问题是:如何将此属性绑定到标签显示的图像?
从我看到的情况来看,JGoodies非常适合将字符串等字符串绑定到文本字段,但在这种情况下,还应该有一个转换,一些逻辑决定将枚举属性映射到图像。
答案 0 :(得分:3)
似乎我只需要仔细查看Binding API。 AbstractConverter
正是我所寻找的。 p>
Bindings.bind((JComponent) pictureLabel, "icon", new EnumToIconConverter(enumSelectionModel));
bind
方法将pictureLabel的图标绑定到转换器描述的模型。转换器看起来像这样:
class EnumToIconConverter extends AbstractConverter {
EnumToIconConverter(ValueModel subject) {
super(subject);
}
@Override
public Object convertFromSubject(Object enum) {
return enum == Selection.selection1 ? image1 : image2;
}
@Override
public void setValue(Object obj) {
throw new UnsupportedOperationException("setValue makes no sense for this converter");
}
}
convertFromSubject
方法是从Enum到图像的转换完成的地方。我没有实现setValue
因为在这种情况下没有意义。图像不能自行更改,我只希望更新一种方式 - 从枚举属性到图像。