Search code examples
eclipseswtcompositewindowbuilder

CoolBar (java SWT WindowBuilder) Composite doesn't appear in Application


I have a problem when I try to use a coolBar in a composite and then I embed this composite in an application. The coolBar simply doesn't appear. This problem doesn't occours with another tools, like toolBar and other composites. What can I doing wrong or forgetting?

Before following the code, I refer my system:

  • Win7
  • Eclipse:Version: Indigo Service Release 2 Build id: 20120216-1857
  • Google WindowBuilder 1.5.0 Google
  • Plugin 3.1.0
  • SWT Designer 1.5.0
  • Google Web Toolkit 2.4.0

Composite code:

package xx.xxx.xx.pcommJavaGUI.composites;

import org.eclipse.swt.widgets.Composite;

public class TestComposite extends Composite {

    public TestComposite(Composite parent, int style) {
        super(parent, style);
        setLayout(new GridLayout(1, false));

        CoolBar coolBar = new CoolBar(this, SWT.FLAT);

        CoolItem coolItem = new CoolItem(coolBar, SWT.NONE);

        Button btnTest = new Button(coolBar, SWT.NONE);
        coolItem.setControl(btnTest);
        btnTest.setText("Test");

        Tree tree = new Tree(this, SWT.BORDER);
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }

}

And the application Window code:

package xx.xxx.xx.pcommJavaGUI.composites;

import org.eclipse.swt.SWT;

public class TestApplication {

    protected Shell shell;

    public static void main(String[] args) {
        try {
            TestApplication window = new TestApplication();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        shell.setLayout(new GridLayout(1, false));

        TestComposite tc = new TestComposite(shell, SWT.NONE);
        GridData gd_tc = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
        tc.setLayoutData(gd_tc);            
    }
}

Thanks for helping.


Solution

  • You have to set the size of CoolItem manually.

    • First of all pack(); your Button to set it to it's default size.
    • Afterwards set the size of the CoolItem to the size of the Button.

    The Button:

        Button btnTest = new Button(coolBar, SWT.NONE);
        coolItem.setControl(btnTest);
        btnTest.setText("Test");
    
        // If you do not call this, btnTest.getSize() will give you x=0,y=0.
        btnTest.pack();
    

    Set the size of CoolItem:

        Point size = btnTest.getSize();
        coolItem.setControl(btnTest);
        coolItem.setSize(coolItem.computeSize(size.x, size.y));
    

    Links: