【发布时间】:2015-06-29 16:39:19
【问题描述】:
我用这个实现创建了一个 SWT 对话框:
public class FindDialog extends Dialog {
private DialogResult result;
private Display display;
private Shell shell;
private Button okayButton;
/*...*/
public FindDialog(Shell parent) {
this(parent, SWT.APPLICATION_MODAL | SWT.DIALOG_TRIM);
}
public FindDialog(Shell parent, int style) {
super(parent, style);
display = getParent().getDisplay();
initUI();
}
public DialogResult open() {
result = DialogResult.Cancel;
shell.open();
while (shell.isVisible()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
return result;
}
private void initUI() {
shell = new Shell(getParent(), getStyle());
shell.addListener(SWT.Close, new ShellClosingHandler());
okayButton = new Button(shell, SWT.PUSH);
okayButton.addListener(SWT.Selection, new ButtonClickedHandler());
/*...*/
}
private class ButtonClickedHandler implements Listener {
public void handleEvent(Event e) {
Button button = (Button)e.widget;
if (button == okayButton) {
result = DialogResult.OK;
shell.close();
}
}
}
private class ShellClosingHandler implements Listener {
public void handleEvent(Event e) {
if (result == DialogResult.OK) {
e.doit = validate();
}
}
private boolean validate() {
/*...*/
}
}
}
还有一些文本字段、按钮和复选框,但我认为这对我的问题并不重要。
对话窗口会正确弹出,我可以在 GUI 上进行更改而不会出现任何问题。
最后我点击确定按钮,然后发生以下情况:
SWT.Close 事件正在触发,我的验证方法被调用,根据结果对话框是否关闭。到目前为止还可以。
但是 shell.close() 不仅会关闭对话框,还会释放 shell。这正是问题所在,因为
我不想在每次调用 open 方法时都重新构建对话框 GUI。我在程序启动时创建所有对话框,然后只想在需要时打开和关闭它。
在主程序的不同位置关闭对话框后,我需要一些文本字段的值或复选框的状态。因此,持有对话框对象的引用并实现一些 getter 来提取数据似乎是个好主意。但是如果 shell 被处理掉,我就没有机会得到信息了。
如果 shell 被释放,那么我将失去对话框的“状态”,因此我必须在下次显示对话框时重新填充它。
所以我的问题是:是否有可能阻止外壳处理? 还是我忽略了另一个概念,因此我不必重新构建完整的对话框集?
【问题讨论】:
-
大多数程序在每次需要时都会构建对话框。应该比对话持续时间更长的信息应该存储在另一个类中。