是由于使用反射而带来的性能上的轻微降低。大多数 应用程序不会受这一性能下降影响,而大型或实时应用程序的开发人员应该牢记这一点。
清单 6. 使用 UniversalImmutableIData 的 createRow() 方法
protected Vector createRow(Bicycle bicycle)
{
Vector vec = new Vector();
vec.add(new UniversalImmutableIData(bicycle, "modelName"));
vec.add(new UniversalImmutableIData(bicycle, "modelID"));
vec.add(new UniversalImmutableIData(bicycle, "manufacturer"));
vec.add(new UniversalImmutableIData(bicycle, "priceAndCost"));
vec.add(new UniversalImmutableIData(bicycle, "inventory"));
return vec;
}
智能数据使Swing保持简单(7)
时间:2011-04-16 IBM Jonathan Simon
清单 7. 来自基于反射的 UniversalImmutableIData 的样本
protected String field = ... //the field name
protected Method accessorMethod = ... //the accessor method
protected Object source = ... //the DataObject
...
protected void setMethods()
{
if (field == null || field.equals(""))
return;
//capitalize the first letter of the field, so you get getName,
//not getname...
String firstChar = field.substring(0,1).toUpperCase();
//remove first letter
String restOfField = field.substring(1);
//add together the string "get" + the capitalized first letter,
//plus the remaining
String fieldAccessor = "get" + firstChar + restOfField;
//cache the method object for future use
this.setAccessorMethod(fieldAccessor);
}
...
protected void setAccessorMethod(String methodName)
{
try
{
accessorMethod = source.getClass().getMethod(methodName, null);
}
catch ( ... )
{
...
}
}
...
public Object getData()
{
try
{
return accessorMethod.invoke(source, null);
}
catch ( ... )
{
...
}
}
智能数据使Swing保持简单(8)
时间:2011-04-16 IBM Jonathan Simon
可编辑智能数据的数据间接层(MutableIData)
通过增加一个 setData() 方法, MutableIData 继承了 ImmutableIData ,使之可修改 。 setData() 方法采用新数据值作为一个参数,并返回一个表示编辑是否成功的布尔值。通 常,有必要对 setData() 方法中的新数据值进行强制类型转换,以与 DataObject 中那个字 段高速缓存的数据类型相匹配。标准实现安全地测试对象类型,如果类类型不匹配,则返回 值为 false。
清单 8. “自行车制造商”的 MutableIData
public boolean setData(Object data)
{
if (!data instanceof String)
return false;
((Bicycle)this.getSource()).setManufacturer((String)data);
return true;
}
一旦编写完所有的新 MutableIData 对象,则更新 getRow() 方法来实例化 MutableIData 实例而不是与其对应的 Immutable 实例。我发现,当字段明确是不可修改时 ,只生成 ImmutableIData 对象。否则,知道不会调用 setData() 方法,生成了 MutableIData 并且仅在只读表中使用它。
定制编辑器
既然已经能够修改数据了,就有了一个大的改变:编辑数据需要定制编辑器。如果使用缺 省编辑器,那么 JTable 将会检索编辑 |