繁体   English   中英

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

[英]SWT - Removing a ListChangeListener on Dialog Close

当我在对话框类中创建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.红色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并隐藏外壳。

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

  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

    @Override protected void createButtonsForButtonBar(Composite parent){createButton(parent,IDialogConstants.CLOSE_ID,“ Close Aplot”,true); }

    @Override protected void closePressed(){getShell()。setVisible(false); }

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

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

  5. 我不确定如何获得积极的听众?

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

您是否尝试过将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);
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM