当我在对话框类中创建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。
我想要的是让关闭对话框的两种方法都相同。
是否可以向Shell和handleEvent方法添加侦听器。打电话给okPressed方法?
getShell().addListener(SWT.Close, new Listener() {
@Override
public void handleEvent(Event e) {
okPressed();
}
});
我应该使用Window.Close而不是SWT.Close吗?
我应该使用Close_ID而不是ok_ID
@覆盖 protected void createButtonsForButtonBar(Composite parent){ createButton(parent,IDialogConstants.CLOSE_ID,“Close Aplot”, 真正); }
@覆盖 protected void closePressed(){ 。getShell()调用setVisible(假); }
有没有办法获取我的活动ListChangeListener并将其删除?
protected void closePressed(){ 。AplotDataModel.getInstance()getObservableList()removeListChangeListener(本)。 }
我不确定如何获得积极的听众?
我想使用Windows关闭按钮(红色X)或表单上的关闭按钮关闭对话框。如果可能的话,我希望这两个动作都使用相同的代码从我的IObservableList中删除活动的Listener并关闭对话框。
答案 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);
}
});
}