【问题标题】:Preventing SWT shell from disposing防止 SWT shell 被释放
【发布时间】: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。这正是问题所在,因为

  1. 我不想在每次调用 open 方法时都重新构建对话框 GUI。我在程序启动时创建所有对话框,然后只想在需要时打开和关闭它。

  2. 在主程序的不同位置关闭对话框后,我需要一些文本字段的值或复选框的状态。因此,持有对话框对象的引用并实现一些 getter 来提取数据似乎是个好主意。但是如果 shell 被处理掉,我就没有机会得到信息了。

  3. 如果 shell 被释放,那么我将失去对话框的“状态”,因此我必须在下次显示对话框时重新填充它。

所以我的问题是:是否有可能阻止外壳处理? 还是我忽略了另一个概念,因此我不必重新构建完整的对话框集?

【问题讨论】:

  • 大多数程序在每次需要时都会构建对话框。应该比对话持续时间更长的信息应该存储在另一个类中。

标签: java shell swt dispose


【解决方案1】:
if (button == okayButton) {
        result = DialogResult.OK;
        shell.setVisible(false);
      }

你可以使用 setVisible(false) 代替 close

所以它会被隐藏而不会被丢弃。

隐藏后可以获取文本框的值

无需再次重建

隐藏后文本框中过去的值会在那里。

【讨论】:

  • 更改可见性听起来很容易。但是 SWT.Close 事件并没有触发,不是吗?
  • 是的。该事件不会被引发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2021-10-13
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多