java 数据绑定并验证 TableViewer?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3364108/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Databind and validate a TableViewer?
提问by flumins
I use the org.eclipse.core.databindingframework to bind some Textfields in an SWT application. I add an update strategy to validate the data and to set the value on the model only when the user click on the save button:
我使用该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);
This piece of code works really well.
这段代码工作得非常好。
But how can I do the same on a TableViewer?
但是我怎么能在 a 上做同样的事情TableViewer呢?
I want it to work so that when I add something in the IHM, the model stay unchanged until I call getBindingContext().updateModels();
我希望它能够工作,这样当我在 IHM 中添加一些东西时,模型保持不变,直到我打电话 getBindingContext().updateModels();
回答by qrtt1
You do not need use the JFace Databinding Framework in TableViewer. Manipulation the structured data is simpler then SWT controls, such TableViewer, ListViewerand TreeViewer. You can use those viewer in the same way:
您不需要在TableViewer. 操作结构化数据比 SWT 控件更简单,例如TableViewer、ListViewer和TreeViewer。您可以以相同的方式使用这些查看器:
- create viewer
- set content provider
- set label provider (suggested)
- set filter (optional)
- set sorter (optional)
- 创建查看器
- 设置内容提供者
- 设置标签提供程序(建议)
- 设置过滤器(可选)
- 设置分拣机(可选)
After the viewer created, just invoke viewer.setInput(data)to put all the things to your viewer.
查看器创建后,只需调用viewer.setInput(data)即可将所有内容放到您的查看器中。
There are a list of model:
有一个模型列表:
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);
The magic happens in the content provider:
神奇的事情发生在内容提供者中:
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 */
}
Each model will become a TableItemand the model in the TableItem(item.getData()).
每个模型都将成为一个TableItem和TableItem(item.getData()).
However, a table composed by many columns, you need the LabelProviderto help you mapping the property of model to the TableItem:
但是,一个由许多列组成的表,您需要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 "";
}
}
The propagation of models to viewer is easy. If you will propagate viewer to the binded model, using the CellEditoris simple as well.
To use CellEditor, you need set the column properties, cell editors and cell modifier to TableViewer:
将模型传播给查看器很容易。如果您将查看器传播到绑定模型,使用CellEditor也很简单。要使用CellEditor,您需要将列属性、单元格编辑器和单元格修改器设置为TableViewer:
tableViewer.setColumnProperties(COLUMNS_PROPERTIES);
tableViewer.setCellEditors(new CellEditor[] {
new TextCellEditor(table), new TextCellEditor(table) });
tableViewer.setCellModifier(new ModelCellModifier(tableViewer));
The CellModifier likes this:
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();
}
}
}
Everything is simple but there are many steps to make all together.
一切都很简单,但要完成所有步骤需要很多步骤。
回答by qualidafial
Use ViewerSupport:
使用查看器支持:
TableViewer tableViewer = ...
IObservableList tableElements = ...
IValueProperty[] columnProperties = ...
ViewerSupport.bind(tableViewer, tableElements, columnProperties);
回答by Quincy
i agree with qualidafial.
我同意qualidafial。
Snippet017TableViewerWithDerivedColumnsfrom the jface.databindingsnippets is a full example of this.
Snippet017TableViewerWithDerivedColumns从jface.databinding片段是一个完整的例子。

