如何以编程方式重新打开对话框

时间:2014-01-27 11:43:57

标签: java dialog swt jface

我在按钮栏中有一个JFace对话框和一个切换按钮(其文本是“冻结”或“解冻”)。

最初我选择一个对象并单击菜单项以打开对话框。

从那时起,每当我点击切换按钮时(当文本上的文字为“解冻”时),对话框应关闭并重新打开。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

这应该让你知道如何做到这一点(快速破解):

private static MyDialog dialog;

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final Button openDialog = new Button(shell, SWT.TOGGLE);
    openDialog.setText("Toggle dialog");

    openDialog.addListener(SWT.Selection, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            if (openDialog.getSelection())
            {
                if (dialog == null)
                {
                    dialog = new MyDialog(new Shell(display));
                    dialog.open();
                }

                if(dialog.getShell() != null && !dialog.getShell().isDisposed())
                    dialog.getShell().setVisible(openDialog.getSelection());
            }
            else
            {
                if (dialog != null && dialog.getShell() != null && !dialog.getShell().isDisposed())
                    dialog.getShell().setVisible(openDialog.getSelection());
            }
        }
    });

    shell.open();
    shell.pack();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
            display.sleep();
        }
    }

    display.dispose();
}

private static class MyDialog extends Dialog
{

    public MyDialog(Shell parentShell)
    {
        super(parentShell);
        setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE);
    }

    @Override
    protected Control createDialogArea(Composite parent)
    {
        Composite container = (Composite) super.createDialogArea(parent);
        Text text = new Text(container, SWT.BORDER);

        return container;
    }

    @Override
    protected void configureShell(Shell newShell)
    {
        super.configureShell(newShell);
        newShell.setText("Some dialog");
    }

    @Override
    protected Point getInitialSize()
    {
        return new Point(450, 300);
    }
}

首次按下该按钮将创建并打开对话框,并隐藏/取消隐藏后续按下事件(使用Shell#setVisible(boolean))。

如果这不是您的想法,请更新您的问题或发表评论。