ダイアログクラスで 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 を参照していますが、更新内のウィジェットは既に破棄されています。
現在、ダイアログを閉じる方法は 2 つあります。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を使用してシェルを隠しています。
私が望むのは、ダイアログを閉じる両方の方法を同じにすることです。
シェルと handleEvent メソッドにリスナーを追加することは可能ですか。okPressed メソッドを呼び出していますか?
getShell().addListener(SWT.Close, new Listener() { @Override public void handleEvent(Event e) { okPressed(); } });
SWT.Close の代わりに Window.Close を使用する必要がありますか?
ok_ID の代わりに Close_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 から削除し、ダイアログを閉じることを望みます。