gpt4 book ai didi

java - SWT - 在对话框关闭时删除 ListChangeListener

转载 作者:行者123 更新时间:2023-12-01 23:46:41 24 4
gpt4 key购买 nike

当我在对话框类中创建 TableViewer 时。我正在添加一个 ListChangeListener。该监听器监听我的数据模型类中的 ObservableList。

这是我在对话框类中的 createTableViewer 方法。

 private void createTableViewer(Composite parent) {
viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION);
IObservableList iob = AplotDataModel.getInstance().getObservableList();
viewer.setInput(iob);
iob.addListChangeListener(new IListChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
updateTableViewer();
}
});
}

所以发生了什么。当用户使用窗口关闭按钮(红色 X)关闭对话框时。那就是处理所有小部件并关闭窗口。当对话框重新打开时。ListChangeListener 正在查找 updateTableViewer,但更新中的小部件已被释放。

现在有两种方法可以关闭对话框。1. Red X - 可能执行 Window.close()2. 表单上我的关闭按钮。

@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, "Close Aplot",
true);
}

@Override
protected void okPressed() {
getShell().setVisible(false);
}

这是使用 okPressed 并隐藏 shell。

我想要的是关闭对话框的两种方法相同。

  1. 是否可以在 Shell 和 handleEvent 方法中添加监听器。调用了 okPressed 方法吗?

      getShell().addListener(SWT.Close, new Listener() {
    @Override
    public void handleEvent(Event e) {
    okPressed();
    }
    });
  2. 我应该使用 Window.Close 而不是 SWT.Close 吗?

  3. 我应该使用 Close_ID 而不是 ok_ID

    @覆盖 protected void createButtonsForButtonBar(复合父级){ createButton(parent, IDialogConstants.CLOSE_ID, "关闭 Aplot", 真的); }

    @覆盖 protected 无效 closePressed() { getShell().setVisible(false); }

  4. 有没有办法获取我的 Activity ListChangeListener 并将其删除?

    protected void closePressed() { AplotDataModel.getInstance().getObservableList().removeListChangeListener(this); }

  5. 我不知道如何获得活跃的听众?

我想使用 Windows 关闭按钮(红色 X)或窗体上的关闭按钮关闭对话框。如果可能的话,我希望这两个操作都使用相同的代码从我的 IObservableList 中删除 Activity 监听器并关闭对话框。

最佳答案

您是否尝试过向窗口添加 DisposeListener ?然后,处置监听器可以注销您在其控件上设置的任何事件监听器。无论窗口如何关闭,无论是通过红色 X 还是通过调用 okPressed() 方法中的 shell.close() ,都会发生这种情况。

例如:

private void createTableViewer(Composite parent) {
viewer = new AplotDataTableViewer(parent, SWT.BORDER|SWT.V_SCROLL|SWT.FULL_SELECTION);
final IObservableList iob = AplotDataModel.getInstance().getObservableList();
viewer.setInput(iob);

final IListChangeListener listener = new IListChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
updateTableViewer();
}
};

iob.addListChangeListener(listener);

getShell().addDisposeListener(
new DisposeListener() {
@Override public void widgetDisposed(DisposeEvent e) {
iob.removeListChangeListener(listener);
}
});
}

关于java - SWT - 在对话框关闭时删除 ListChangeListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16927502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com