How to hide an SWT composite so that it takes no space?
Asked Answered
P

2

27

I need to hide a composite (and all children inside). Just setting setVisible(false) will keep the space of the composite.

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);
Precinct answered 7/7, 2013 at 14:53 Comment(1)
Solution is similar to #17511942 i.e. addListener()Gurango
S
31

Here is some code that does what you want. I basically use GridData#exclude in combination with Control#setVisible(boolean) to hide/unhide the 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();
}

Before hiding:

enter image description here

After hiding:

enter image description here

Stumpage answered 7/7, 2013 at 15:1 Comment(3)
the problem is with shell.pack(), I can't use it because it affects whole guiPrecinct
@Precinct Can you use pack() on the parent of the composite you are trying to hide? If so, look at my updated code. If not, you will have to manually decrease the size of the shell by the size of the hidden composite.Stumpage
How about content.getParent().layout(true, true)?Morea
S
6

Define a GridData for your control and then after you do: control.setVisible(false) do gridData.exclude=true

Surfacetoair answered 12/3, 2018 at 11:26 Comment(1)
I like this idea! Thanks!Banlieue

© 2022 - 2024 — McMap. All rights reserved.