0

ダイアログクラスで 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を使用してシェルを隠しています。

私が望むのは、ダイアログを閉じる両方の方法を同じにすることです。

  1. シェルと handleEvent メソッドにリスナーを追加することは可能ですか。okPressed メソッドを呼び出していますか?

      getShell().addListener(SWT.Close, new Listener() {
        @Override
        public void handleEvent(Event e) {
           okPressed();
        }
      });
    
  2. SWT.Close の代わりに Window.Close を使用する必要がありますか?

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

  4. アクティブな ListChangeListener を取得して削除する方法はありますか?

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

  5. アクティブなリスナーを取得する方法がわかりません。

Windows の [閉じる] ボタン (赤い X) またはフォームの [閉じる] ボタンを使用して、ダイアログを閉じたいと思います。可能であれば、両方のアクションで同じコードを使用してアクティブなリスナーを IObservableList から削除し、ダイアログを閉じることを望みます。

4

1 に答える 1

3

DisposeListenerウィンドウに を追加してみましたか? その後、dispose リスナーは、そのコントロールに設定したイベント リスナーの登録を解除できます。shell.close()これは、赤い X から、または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);
        }
    });
}
于 2013-06-05T04:15:11.403 に答える