刷新时如何在 JFace TableViewer 中保留选择?
How to preserve selections in a JFace TableViewer when refreshing?
在我的项目中,我有一个 TableViewer
,它有一个模型、一个内容提供者和一个标签提供者。
更新模型后,我调用 tableviewer.refresh(true)
并根据此处的文档:
我希望我的选择得到保留。
不幸的是,这并没有发生。有人知道解决方案吗?
这是我在这里遗漏的东西还是错误?
编辑:
这是我的模型 class(计数器用于测试目的,以确保我在第一次刷新后返回相同的列表):
public class ItemWorkgroup {
List<Item> currentItems = new ArrayList<Item>();
static int counter = 0;
public ItemWorkgroup()
{
}
public void add(Item item)
{
currentItems.add(item);
}
public Object[] getItems()
{
return currentItems.toArray();
}
public void addList(List<Item> newItemsList)
{
System.out.println("Current items first 1: "+currentItems);
if(counter == 0)
{
currentItems = newItemsList;
counter++;
}
System.out.println("Current items first 2: "+currentItems);
}
public List<Item> getItemList()
{
return currentItems;
}
}
这是内容提供者class:
public class ContentProvider implements IStructuredContentProvider{
private Mediator mediator;
private ItemWorkgroup model;
public ContentProvider(Mediator mediator, ItemWorkgroup model) {
// TODO Auto-generated constructor stub
this.mediator = mediator;
this.model = model;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
System.out.println("Input changed");
}
@Override
public Object[] getElements(Object inputElement) {
// TODO Auto-generated method stub
System.out.println("Getting elements");
if(inputElement instanceof ItemWorkgroup)
{
return ((ItemWorkgroup) inputElement).getItems();
}
else
return new Object[0];
}
public ItemWorkgroup getItems()
{
//Items is a list of items that I'm getting from somewhere
model.addList(items);
return model;
}
查看器会尝试保持选择,但如果您的内容提供商 return 对刷新后选择的元素使用不同的对象,则树查看器将无法恢复选择。
您的内容提供者必须 return 相同的对象,用于未更改的内容,以便保留选择。 (或者您可以 return 一个对象,其中 equals
和 hashCode
方法使它看起来相同)。
在我的项目中,我有一个 TableViewer
,它有一个模型、一个内容提供者和一个标签提供者。
更新模型后,我调用 tableviewer.refresh(true)
并根据此处的文档:
我希望我的选择得到保留。
不幸的是,这并没有发生。有人知道解决方案吗?
这是我在这里遗漏的东西还是错误?
编辑: 这是我的模型 class(计数器用于测试目的,以确保我在第一次刷新后返回相同的列表):
public class ItemWorkgroup {
List<Item> currentItems = new ArrayList<Item>();
static int counter = 0;
public ItemWorkgroup()
{
}
public void add(Item item)
{
currentItems.add(item);
}
public Object[] getItems()
{
return currentItems.toArray();
}
public void addList(List<Item> newItemsList)
{
System.out.println("Current items first 1: "+currentItems);
if(counter == 0)
{
currentItems = newItemsList;
counter++;
}
System.out.println("Current items first 2: "+currentItems);
}
public List<Item> getItemList()
{
return currentItems;
}
}
这是内容提供者class:
public class ContentProvider implements IStructuredContentProvider{
private Mediator mediator;
private ItemWorkgroup model;
public ContentProvider(Mediator mediator, ItemWorkgroup model) {
// TODO Auto-generated constructor stub
this.mediator = mediator;
this.model = model;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
System.out.println("Input changed");
}
@Override
public Object[] getElements(Object inputElement) {
// TODO Auto-generated method stub
System.out.println("Getting elements");
if(inputElement instanceof ItemWorkgroup)
{
return ((ItemWorkgroup) inputElement).getItems();
}
else
return new Object[0];
}
public ItemWorkgroup getItems()
{
//Items is a list of items that I'm getting from somewhere
model.addList(items);
return model;
}
查看器会尝试保持选择,但如果您的内容提供商 return 对刷新后选择的元素使用不同的对象,则树查看器将无法恢复选择。
您的内容提供者必须 return 相同的对象,用于未更改的内容,以便保留选择。 (或者您可以 return 一个对象,其中 equals
和 hashCode
方法使它看起来相同)。