防止SWT shell处置

时间:2015-06-29 16:39:19

标签: java shell swt dispose

我使用此实现创建了一个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来提取数据似乎是个好主意。但如果外壳被处理掉,我就没有机会获得这些信息。

  3. 如果处理了shell,那么我将松开对话框的“状态”,因此我必须在下次显示对话框时重新填充它。

  4. 所以我的问题:是否有可能阻止shell处理? 或者是否有另一个我忽略的概念,所以我不必重构我的完整对话框?

1 个答案:

答案 0 :(得分:0)

  $('.accordion > dt > a').click(function(event) {
    var clickID = event.target.id;
    getLogin();
    $(this).parent().css('transform','scale(1.1,1.1)');
    $(this).parent().next().delay(200).slideDown(600,'linear');
    $("#" + clickID +"username").append(makeUsername);
    $("#" + clickID +"password").append(makePassword);
    $('.downloads').delay(600).slideDown(600);
    return false;
     });

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

所以它会被隐藏而不会被处置。

隐藏

后,您可以获取文本框的值

无需再次重建

隐藏后,文本框中的过去值将存在。