Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java createButton-SWT.PUSH与OK_Java_Button_Swt - Fatal编程技术网

Java createButton-SWT.PUSH与OK

Java createButton-SWT.PUSH与OK,java,button,swt,Java,Button,Swt,这是我的createButtonsForButtonsBar方法 protected void createButtonsForButtonBar(Composite parent) { Button okButton = createButton(parent, SWT.PUSH, "Close Aplot", true); okButton.setEnabled(true); okButton.addSelectionListener(new SelectionAdapter()

这是我的
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);

因为OK版本在此行抛出运行时空指针错误

getShell().setVisible(false);
错误大致如下:

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

问题:

OK
SWT.PUSH
之间有什么区别


为什么“确定”会导致上述错误?

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

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


在这里,您可能想做的是让系统为您关闭对话框,完全删除您的选择侦听器。如果您想在对话框关闭时执行某些操作,比如清理一些句柄,您只需覆盖
close()

Edward提到的任何东西都是正确的。您应该在该方法中传递按钮ID。但是,
org.eclipse.jface.dialogs.Dialog.createButton中的按钮样式已经是
SWT.PUSH
样式(复合、int、String、boolean)
。请仔细检查。您还应该调用/override
org.eclipse.jface.dialogs.Dialog.okPressed()
处理对话框的关闭操作。希望这也有帮助。

通过您的回答,我发现我的问题更多的是设计缺陷。您已经回答了这个问题。我可能需要打开另一个关于最佳做法的问题来隐藏对话框。
getShell().setVisible(false);