Java 侦听WritableList中的更改

Java 侦听WritableList中的更改,java,swt,listener,Java,Swt,Listener,数据模型类 创建IObservableList IObservableList observableList=新的可写列表() Add方法将数据添加到observableList 方法返回observableList 表查看器类 将内容提供程序设置为ObservableListContentProvider GUI类 查看器setInput从数据模型类获取ObservableList 一切似乎都按预期工作,表查看器会随着对ObservableList的更改而更新 但是我遇到的问题是如何更新GUI

数据模型类

创建IObservableList

  • IObservableList observableList=新的可写列表()
  • Add方法将数据添加到observableList
  • 方法返回observableList
  • 表查看器类

  • 将内容提供程序设置为ObservableListContentProvider
  • GUI类

  • 查看器setInput从数据模型类获取ObservableList
  • 一切似乎都按预期工作,表查看器会随着对ObservableList的更改而更新

    但是我遇到的问题是如何更新GUI中的按钮。我有几个按钮,可以根据数据模型中ObservableList中对象的数量启用和禁用。为了运行该逻辑,我必须知道列表中何时有更改

    我尝试在GUI类中实现IListChangeListener。然后添加方法

    public void handleListChange(ListChangeEvent arg0) {
      updateButtons();  <-- My method to run the logic
    
    这是我唯一的选择

     addSelectionChangedListener(ISelectionChangeListener listener)
    

    我不在乎选择是否更改-仅当列表已更改时才如此。

    我已尝试过此示例,它对我有效:

    IObservableList observableList = new WritableList();
    observableList.addListChangeListener(new IListChangeListener() {
    
        @Override
        public void handleListChange(ListChangeEvent event) {
            System.out.println(event.diff);
        }
    });
    observableList.add("element");
    observableList.add("element");
    observableList.add("element");
    
    TableViewer viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
    viewer.getTable().setHeaderVisible(true);
    viewer.getTable().setHeaderVisible(true);
    viewer.setContentProvider(new ObservableListContentProvider());
    
    TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
    column.getColumn().setText("Column");
    column.getColumn().setWidth(200);
    
    column.setLabelProvider(new ColumnLabelProvider());
    
    // Provide the input to the ContentProvider
    viewer.setInput(observableList);
    

    现在,当应用程序启动时,IListChangeListener会被调用三次,然后每次我向observableList添加一个元素。

    是的,实现IListChangeListener是正确的方法。updateButtons()在做什么?@Behnil检查列表以确保列表中至少有一个对象-如果没有,我禁用所有按钮,如果有,我启用按钮。另请参见上面的编辑ISelectionChangeListener有什么问题?在这里发布updateButtons()内容。@Behnil我可能会看到问题,让我看看test@Behnil从未调用handleListChange方法(ListChangeEvent arg0)。这是因为我没有向表查看器添加侦听器吗?
    IObservableList observableList = new WritableList();
    observableList.addListChangeListener(new IListChangeListener() {
    
        @Override
        public void handleListChange(ListChangeEvent event) {
            System.out.println(event.diff);
        }
    });
    observableList.add("element");
    observableList.add("element");
    observableList.add("element");
    
    TableViewer viewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
    viewer.getTable().setHeaderVisible(true);
    viewer.getTable().setHeaderVisible(true);
    viewer.setContentProvider(new ObservableListContentProvider());
    
    TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
    column.getColumn().setText("Column");
    column.getColumn().setWidth(200);
    
    column.setLabelProvider(new ColumnLabelProvider());
    
    // Provide the input to the ContentProvider
    viewer.setInput(observableList);