如何在java JFace对话框中禁用关闭按钮(如果可能,使其完全消失)?
答案 0 :(得分:12)
对话框中的按钮是使用createButton()方法创建的。要“过滤掉”取消按钮,您可以按如下方式覆盖它:
protected Button createButton(Composite parent, int id,
String label, boolean defaultButton) {
if (id == IDialogConstants.CANCEL_ID) return null;
return super.createButton(parent, id, label, defaultButton);
}
但是,Dialog的关闭按钮(由操作系统提供)仍然有效。要禁用它,您可以覆盖canHandleShellCloseEvent():
protected boolean canHandleShellCloseEvent() {
return false;
}
这是一个完整的,最小的例子:
package stackoverflow;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class JFaceDialogNoCloseButton {
private static final Display DISPLAY = Display.getDefault();
public static void main(String[] args) {
Shell shell = new Shell(DISPLAY, SWT.CLOSE | SWT.RESIZE);
shell.setSize(200, 100);
shell.setLayout(new FillLayout());
final Dialog dialog = new InputDialog(shell, "Title", "Message",
"initial value", null) {
@Override
protected Button createButton(Composite parent, int id,
String label, boolean defaultButton) {
if (id == IDialogConstants.CANCEL_ID)
return null;
return super.createButton(parent, id, label, defaultButton);
}
@Override
protected boolean canHandleShellCloseEvent() {
return false;
}
};
Button button = new Button(shell, SWT.PUSH);
button.setText("Launch JFace Dialog");
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
dialog.open();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!DISPLAY.readAndDispatch()) {
DISPLAY.sleep();
}
}
DISPLAY.dispose();
}
}
答案 1 :(得分:9)
要使对话框上的X按钮不可见,您必须关闭SWT.CLOSE样式属性。需要注意的是,必须在打开对话框之前完成此操作,因此在对话框的构造函数中可以正常工作。
public NoCloseDialog(...){
super(...);
setShellStyle(getShellStyle() & ~SWT.CLOSE);
}
JFace窗口上的默认shell样式为SWT.SHELL_TRIM
,等于SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.RESIZE
答案 2 :(得分:7)
有关如何隐藏Dialog
中的关闭按钮的示例,请参阅here。您只需覆盖以下方法:
protected void setShellStyle(int arg0){
//Use the following not to show the default close X button in the title bar
super.setShellStyle(SWT.TITLE);
}
否则覆盖close()
并返回false以防止关闭。
更新:虽然上面的代码“解决”了手头的问题,但它并没有解释很多,并引入了一个令人讨厌的错误。请参阅Goog的答案,以获得更好的版本。
答案 3 :(得分:1)
对于从org.eclipse.jface.dialogs.Dialog
扩展的对话框,覆盖canHandleShellCloseEvent
对我不起作用,
然后关闭整个应用程序对我的情况来说是一个很好的策略,因为如果用户选择取消,我必须这样做。
我知道这不是问题的确切答案,但可以作为解决方法来处理这种情况。
在open()
或createContents()
方法下,
shell.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
System.exit(0);
}
});