[英]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并隐藏外壳。
我想让两种关闭对话框的方法相同。
是否可以在Shell和handleEvent方法中添加侦听器。 调用了okPressed方法?
getShell().addListener(SWT.Close, new Listener() { @Override public void handleEvent(Event e) { okPressed(); } });
我应该使用Window.Close而不是SWT.Close吗?
我应该使用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); }
有没有办法获取我的活动ListChangeListener并将其删除?
protected void closePressed(){AplotDataModel.getInstance()。getObservableList()。removeListChangeListener(this); }
我不确定如何获得积极的听众?
我想使用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.