SWT - 在Dialog Close上删除ListChangeListener

时间:2013-06-04 21:08:31

标签: java swt

当我在对话框类中创建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并隐藏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(Composite parent){    createButton(parent,IDialogConstants.CLOSE_ID,“Close Aplot”,    真正);  }

    @覆盖  protected void closePressed(){      。getShell()调用setVisible(假);  }

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

例如:

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);
        }
    });
}