【问题标题】:Listening for changes in WritableList监听 WritableList 的变化
【发布时间】:2023-04-07 08:38:01
【问题描述】:

数据模型类

创建一个 IObservableList

  1. IObservableList observableList = new WritableList();
  2. Add 方法向 observableList 添加数据
  3. 返回 observableList 的方法

表格查看器类

  1. 将内容提供者设置为 ObservableListContentProvider

图形界面类

  1. 查看器 setInput 从数据模型类中获取 ObservableList

一切似乎都按预期工作,表格查看器会随着 ObservableList 的更改而更新。

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

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

public void handleListChange(ListChangeEvent arg0) {
  updateButtons();  <-- My method to run the logic

}

这不起作用,我应该实现其他东西而不是 IListChangeListener 吗?

我不确定应该在 GUI 类中实现什么来监听更改?

编辑

我必须为查看器添加一个监听器吗?

viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION);
viewer.setInput(AplotDataModel.getInstance().getObservableList());
viewer.addListener(etc... )

这是我唯一的选择

 addSelectionChangedListener(ISelectionChangeListener listener)

我不关心选择是否改变 - 只在列表改变时。

【问题讨论】:

  • 是的,实现 IListChangeListener 是正确的方法。 updateButtons() 在做什么?
  • @Behnil 检查列表以确保列表中至少有 1 个对象 - 如果没有,我禁用所有按钮,如果有我启用按钮。另请参阅上面的编辑
  • ISelectionChangeListener 有什么问题?在此处发布 updateButtons() 内容。
  • @Behnil 我可能会看到问题,让我测试一下
  • @Behnil 方法 handleListChange(ListChangeEvent arg0) 永远不会被调用。那是因为我没有向表查看器添加侦听器吗?

标签: java swt listener


【解决方案1】:

我已经尝试过这个例子,它对我有用:

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 在应用程序启动时被调用 3 次,然后每次我向 observableList 添加元素时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多