如何在不关闭上一个弹出式外壳的情况下打开弹出式外壳



我正在使用这个PopupComposite,我想知道如何打开一个包含按钮的弹出外壳(pc1),它打开另一个弹出外壳(pc2),而不关闭第一个弹出外壳。我尝试修改PopupComposite的激活侦听器,但我得到的只是一个解决方案,每次打开pc2时都会闪烁pc1。我在shellActivated中添加了以下代码:

if(shell.getParent() != null)
            shell.getParent().setVisible(true);

每当弹出窗口失去焦点时,它们都必须隐藏(我不能将FocusListener用于shell,因为它在mac上不起作用)。

这是我的测试仪:

public class TestShells
{
    public static void main(final String[] args)
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));

        final Composite container = new Composite(shell, SWT.NULL);
        container.setLayout(new FillLayout());
        final Button btn = new Button(container, SWT.PUSH);
        btn.setText("Button 1");
        final PopupComposite pc1 = new PopupComposite(Display.getDefault().getActiveShell(), SWT.NULL);
        final Button btn2 = new Button(pc1, SWT.PUSH);
        btn2.setText("Button 2");
        final PopupComposite pc2 = new PopupComposite(pc1.getShell(),SWT.NULL);
        final Text text = new Text(pc2, SWT.BORDER);
        btn.addSelectionListener(new SelectionListener()
        {
            public void widgetSelected(final SelectionEvent e)
            {
                pc1.show(btn.getLocation());
            }
            public void widgetDefaultSelected(final SelectionEvent e)
            {
            }
        });
        btn2.addSelectionListener(new SelectionListener()
        {
            public void widgetSelected(final SelectionEvent e)
            {
                pc2.show(btn2.getLocation());
            }
            public void widgetDefaultSelected(final SelectionEvent e)
            {
                // TODO Auto-generated method stub
            }
        });
        shell.pack();
        shell.open();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

非常感谢!

我不知道如何隐藏前一个窗口,但作为一名Windows用户,我也可以告诉你,在一堆程序下面弹出dissapear通常会让人感到沮丧,所以我建议不要这样做。

至于实际问题:你试过JDialog吗?只需在按下按钮时显示的对话框窗口中堆叠一个JOptionPane即可。

参见http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

编辑:这是应该工作的代码片段,我还没有测试过。

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
public class Snippet99 {
  public static void main(String[] args) 
  {
    final private Display display = new Display();
    final private Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, false));
    final Composite container = new Composite(shell, SWT.NULL);
        container.setLayout(new FillLayout());
    final private Button btn = 
new Button(container, SWT.PUSH).setText("Button 1");
    final private PopupComposite pc1 = 
new  PopupComposite(Display.getDefault().getActiveShell(), SWT.NULL);
    final private Button btn2 = 
new Button(pc1, SWT.PUSH).setText("Button 2");
    final private PopupComposite pc2 = 
new PopupComposite(pc1.getShell(),SWT.NULL);
    private Text text = new Text(pc2, SWT.BORDER);
    /*
    only use final if you're setting the value immediately and will never change it again,
    make sure you set the accessibility of your items (protected/private/public)
    */
    Listener listener = new Listener() {
      public void handleEvent(Event event) {
        pc1.show(btn.getLocation());
      }
    };
    btn.addListener(SWT.Selection, listener);
    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }
}

最新更新