2013-07-07 27 views
16

Potrzebuję ukryć kompozyt (i wszystkie dzieci w środku). Ustawienie tylko setVisible(false) zachowa przestrzeń kompozytu.Jak ukryć kompozyt SWT, aby nie zajmował miejsca?

Composite outer = new Composite(parent, SWT.NONE);  
outer.setLayout(new GridLayout(1,false)); 
outer.setLayoutData(new GridData(GridData.FILL_BOTH)); 

Composite compToHide = new MyComposite(outer, SWT.NONE);   
compToHide.setLayout(new GridLayout()); 
compToHide.setVisible(false); 
+0

Rozwiązanie jest podobny do http : //stackoverflow.com/questions/17511442/eclipse-plugin-make-co mbo-to-handle-enter-key tj. addListener() –

Odpowiedz

18

Oto kod, który robi to, co chcesz. I w zasadzie używać GridData#exclude w połączeniu z Control#setVisible(boolean) do ukrycia/pokazania Composite:

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new GridLayout(1, true)); 

    Button hideButton = new Button(shell, SWT.PUSH); 
    hideButton.setText("Toggle"); 

    final Composite content = new Composite(shell, SWT.NONE); 
    content.setLayout(new GridLayout(3, false)); 

    final GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); 
    content.setLayoutData(data); 

    for(int i = 0; i < 10; i++) 
    { 
     new Label(content, SWT.NONE).setText("Label " + i); 
    } 

    hideButton.addListener(SWT.Selection, new Listener() 
    { 
     @Override 
     public void handleEvent(Event arg0) 
     { 
      data.exclude = !data.exclude; 
      content.setVisible(!data.exclude); 
      content.getParent().pack(); 
     } 
    }); 

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

Przed ukrywanie:

enter image description here

Po ukryciu:

enter image description here

+0

Problem jest z plikiem shell.pack(), nie mogę go użyć, ponieważ wpływa on na cały kod GUI – yuris

+0

@yuris Czy możesz użyć 'pack()' na rodzica kompozyt, który próbujesz ukryć? Jeśli tak, spójrz na mój zaktualizowany kod. Jeśli nie, będziesz musiał ręcznie zmniejszyć rozmiar powłoki o rozmiar ukrytego złożenia. – Baz

+2

Co na temat 'content.getParent(). Layout (true, true)'? – winklerrr