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);

错误大致:

com.test.BaseDialog$7.widgetSelected(BaseDialog.java:277) 处未处理的事件循环异常 java.lang.NullPointerException

问题 :

OK和 和有什么不一样SWT.PUSH

为什么OK会导致上述错误?

4

2 回答 2

2

因为OK是指示某些行为的系统按钮 ID。特别是,按下OK按钮将关闭对话框。同时,您添加了一个按钮选择侦听器,该侦听器尝试关闭对话框。可以理解的是,这将失败。

但是,您在这里所做的是创建一个不是系统默认按钮且没有关联的默认行为的按钮。但是您已经混淆SWT.PUSH了 - 样式常量 - 与按钮 ID。如果要提供自己的按钮 ID,则需要使用大于IDialogConstants.CLIENT_ID.

您可能想要在这里做的只是让系统为您关闭对话框,完全删除您的选择侦听器。如果在对话框关闭时您想做一些事情——比如清理一些句柄——你应该简单地覆盖close().

于 2013-03-08T22:48:14.480 回答
0

Whatever Edward mentioned is right. You are should pass button ID in that method. But, the button style is already SWT.PUSH style in org.eclipse.jface.dialogs.Dialog.createButton(Composite, int, String, boolean). Please double check. Also you should call/override org.eclipse.jface.dialogs.Dialog.okPressed() handle close operation for the dialog. Hope this helps as well.

于 2013-03-12T04:12:29.397 回答