2014-09-22 5 views
1

Я использую это PopupComposite, и я хотел бы знать, как открыть всплывающее окно (pc1), содержащее кнопку, которая открывает другую всплывающую оболочку (pc2), не закрывая первая всплывающая оболочка. Я попытался изменить прослушиватель активации PopupComposite, но все, что я получил, было решением, которое мерцает pc1 каждый раз, когда я открываю pc2. Я добавил следующий код в shellActivated:Как открыть всплывающее окно без закрытия предыдущего

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

Всякий раз, когда всплывающие окна теряют фокус, они должны скрывать (я не могу использовать FocusListener для оболочек, так как она не работает на 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(); 
    } 
} 

Большое спасибо!

ответ

1

Я не знаю, как скрыть предыдущее окно, но я, как пользователь Windows, также могу сказать вам, что часто бывает неприятно, что всплывающее окно исчезает под кучей программ, поэтому посоветуйте об этом.

Что касается актуального вопроса: вы пробовали JDialog? Просто соберите JOptionPane в диалоговом окне, которое будет отображаться при нажатии кнопки.

см http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

EDIT: вот фрагмент кода, который должен работать, я не проверял.

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(); 
    } 
} 
+0

Благодарим вас за советы, но мне разрешено использовать только SWT. – spetrila

+1

@JNewbie Что меняет ситуацию. В этом случае посмотрите на этот пример, который изменяет поведение закрытия: http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/Preventashellfromclosingprompttheuser.htm – Chrotenise

+0

уже пробовал это, но мое условие не может быть проверено в этой точке так как оболочка, которую я собираюсь открыть дальше, открывается только после того, как она закрывается – spetrila

Смежные вопросы