flu*_*ins 5 java data-binding jface
我使用org.eclipse.core.databinding框架来绑定TextSWT应用程序中的某些字段.我添加了一个更新策略来验证数据,并仅在用户单击保存按钮时在模型上设置值:
UpdateValueStrategy toModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT);
if (validator != null) {
toModel.setAfterGetValidator(validator);
}
UpdateValueStrategy fromModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
binding = bindingContext.bindValue(SWTObservables.observeText(this, SWT.Modify),
BeansObservables.observeValue(pVO, propertyName), toModel, fromModel);
Run Code Online (Sandbox Code Playgroud)
这段代码非常有效.
但我怎么能这样做TableViewer呢?
我想让它工作,这样当我在IHM中添加一些东西时,模型保持不变直到我打电话 getBindingContext().updateModels();
您不需要使用JFace数据绑定框架TableViewer.操纵所述结构化数据是简单然后SWT的控制,例如TableViewer,ListViewer和TreeViewer.您可以以相同的方式使用这些查看器:
在查看器创建之后,只需调用viewer.setInput(data)将所有内容放到查看器中.
有一个型号列表:
TableViewer tableViewer = new TableViewer(parent);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);`
for (int i = 0; i < COLUMN_NAMES.length; i++) {
TableColumn tableColumn = new TableColumn(table, SWT.LEFT);
tableColumn.setText(COLUMN_NAMES[i]);
tableColumn.setWidth(COLUMN_WIDTHS[i]);
}
tableViewer.setContentProvider(new ModelContentProvider());
tableViewer.setLabelProvider(new ModelLabelProvider());
tableViewer.setInput(models);
Run Code Online (Sandbox Code Playgroud)
魔术发生在内容提供者:
class ModelContentProvider implements IStructuredContentProvider {
@SuppressWarnings("unchecked")
@Override
public Object[] getElements(Object inputElement) {
// The inputElement comes from view.setInput()
if (inputElement instanceof List) {
List models = (List) inputElement;
return models.toArray();
}
return new Object[0];
}
/* ... other methods */
}
Run Code Online (Sandbox Code Playgroud)
每个模型将成为一个TableItem和模型中的TableItem(item.getData()).
但是,由许多列组成的表,您需要LabelProvider帮助您将模型的属性映射到TableItem:
class ModelLabelProvider extends LabelProvider implements
ITableLabelProvider {
@Override
public Image getColumnImage(Object element, int columnIndex) {
// no image to show
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
// each element comes from the ContentProvider.getElements(Object)
if (!(element instanceof Model)) {
return "";
}
Model model = (Model) element;
switch (columnIndex) {
case 0:
return model.getFoo();
case 1:
return model.getBar();
default:
break;
}
return "";
}
}
Run Code Online (Sandbox Code Playgroud)
模型向观众的传播很容易.如果您将查看器传播到绑定模型,使用CellEditor也很简单.要使用CellEditor,您需要将列属性,单元格编辑器和单元格修改器设置为TableViewer:
tableViewer.setColumnProperties(COLUMNS_PROPERTIES);
tableViewer.setCellEditors(new CellEditor[] {
new TextCellEditor(table), new TextCellEditor(table) });
tableViewer.setCellModifier(new ModelCellModifier(tableViewer));
Run Code Online (Sandbox Code Playgroud)
CellModifier喜欢这个:
class ModelCellModifier implements ICellModifier {
TableViewer viewer;
public ModelCellModifier(TableViewer viewer) {
this.viewer = viewer;
}
@Override
public boolean canModify(Object element, String property) {
// property is defined by viewer.setColumnProperties()
// allow the FOO column can be modified.
return "foo_prop".equals(property);
}
@Override
public Object getValue(Object element, String property) {
if ("foo_prop".equals(property)) {
return ((Model) element).getFoo();
}
if ("bar_prop".equals(property)) {
return ((Model) element).getBar();
}
return "";
}
@Override
public void modify(Object element, String property, Object value) {
if ("foo_prop".equals(property)) {
TableItem item = (TableItem) element;
((Model) item.getData()).setFoo("" + value);
// refresh the viewer to show the changes to our user.
viewer.refresh();
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很简单,但有很多步骤可以让所有人在一起.
| 归档时间: |
|
| 查看次数: |
13994 次 |
| 最近记录: |