适当的方式来反映JFace查看器中的数据更改

时间:2012-08-26 17:50:21

标签: java eclipse swt rcp jface

我正在研究JFace的Eclipse开发。我制作了一个插件,作为ComboViewer虚拟内容提供商。该提供程序实质上将数据模型提供为ArrayList硬编码值。无论如何,我试图理解这种方法。

我通过ComboViewer方法在comboViewer.setInput(list)上设置模型 按下按钮,我调用另一个对象的方法,将list我传递的input更新为ComboViewer(添加另一个元素),然后调用comboViewer.refresh来反映改变,但没有任何反应。

原来:

我需要使用更新后的列表调用comboViewer.setInput(list) ,以便在我的UI组合中查看数据中的更改(即之前添加的内容)。我发现comboViewer.refresh只有在我将comboViewer作为输入Object传递并修改后才会反映任何更新。即如果我这样做:

List<SomeObject> data = ((List<SomeObject>)(comboViewer.getInput()));  
data.add(new SomeObject("aaa","cccc"));  
comboViewer.refresh();    

只有这样才能刷新数据。但我不明白使用这些API的正确方法是什么 我是否应该暂停并修改我在setInput方法中传递的对象?我觉得我不应该这样做。那么refresh的目的是什么?

更新提供给Viewer的数据的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

反映变化的正确方法是致电refreshlist

String[] values = {"1","2","3"};
List<String> list = new ArrayList<String>(Arrays.asList(values));

创建组件

final ComboViewer comboViewer = new ComboViewer(shell, SWT.DROP_DOWN);
comboViewer.setLabelProvider(new LabelProvider());
comboViewer.setContentProvider(new ArrayContentProvider());
comboViewer.setInput(list);
Button button1 = new Button(shell, SWT.PUSH);
button1.setText("Button 5");
button1.addSelectionListener(new SelectionListener(){

  @Override
  public void widgetSelected(SelectionEvent e) {
     // TODO Auto-generated method stub
     System.out.println("Button 5");
     list.add("4");
     comboViewer.refresh();             
  }

  @Override
  public void widgetDefaultSelected(SelectionEvent e) {
     // TODO Auto-generated method stub     
  }

});

按下按钮时,组合查看器会更新。