0

これが私のcreateButtonsForButtonsBarメソッドです。

protected void createButtonsForButtonBar(Composite parent) {
  Button okButton = createButton(parent, SWT.PUSH, "Close Aplot", true);
  okButton.setEnabled(true);
  okButton.addSelectionListener(new SelectionAdapter() {
     public void widgetSelected(SelectionEvent e) {
        viewer = null;
        getShell().setVisible(false);
    }
  });
}

私は変わらなければならなかった

Button okButton = createButton(parent, OK, "Close Aplot", true);

Button okButton = createButton(parent, SWT.PUSH, "Close Aplot", true);

OK バージョンがこの行で実行時ヌル ポインター エラーをスローしていたためです。

getShell().setVisible(false);

おおよそのエラー:

未処理のイベント ループ例外 java.lang.NullPointerException at com.test.BaseDialog$7.widgetSelected(BaseDialog.java:277)

質問 :

OKとはどう違いSWT.PUSHますか?

OK で上記のエラーが発生するのはなぜですか?

4

2 に答える 2

2

OK特定の動作を示すシステム ボタン ID であるためです。特に、OKボタンを押すと、ダイアログが閉じます。一方、ダイアログを閉じようとするボタン選択リスナーも追加しました。当然のことながら、これは失敗します。

ただし、ここで行ったことは、システムの既定のボタンではなく、既定の動作が関連付けられていないボタンを作成することです。SWT.PUSHしかし、スタイル定数とボタン ID を混同しています。独自のボタン ID を提供する場合は、より大きい ID を使用する必要がありますIDialogConstants.CLIENT_ID

おそらくここでやりたいことは、システムにダイアログを閉じさせて、選択リスナーを完全に削除することです。ダイアログが閉じているときに何かしたいことがある場合 (ハンドルのクリーンアップなど) は、単純にオーバーライドする必要がありますclose()

于 2013-03-08T22:48:14.480 に答える
0

エドワードが言ったことは何でも正しい。そのメソッドでボタン ID を渡す必要があります。ただし、ボタンのスタイルは既にSWT.PUSHスタイルになっていorg.eclipse.jface.dialogs.Dialog.createButton(Composite, int, String, boolean)ます。再確認してください。org.eclipse.jface.dialogs.Dialog.okPressed()また、ダイアログのハンドルを閉じる操作を呼び出す/オーバーライドする必要があります。これも役立つことを願っています。

于 2013-03-12T04:12:29.397 に答える