[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Newsgroup Home]
|
[news.eclipse.platform.swt] Re: Composite update problem
|
If you are using 3.1, the following should work for you:
shell.layout(composite_child.getChildren());
If you know exactly which children have changed to can also do:
shell.layout(new Control[] {child1, child2, child5});
If you are not in 3.1, you need to know a bit about the parents between the
shell and composite_mother. If there is a parent that does not change size,
then the chain of layouts trigerred by shell.layout() will stop at the first
parent that does not resize. For example, if you have a parent that is in a
FillLayout, the only time that parent will change size is when its parent
gets bigger - it will not resize just because one of its children changed
its preferred size. If you have identified any parents like that in the
parent heirarchy of composite_child, then you must call layout() on that
parent.
For example:
public static void main (String [] args) {
Display display = new Display ();
final Shell shell = new Shell (display);
FillLayout layout = new FillLayout();
layout.marginWidth = layout.marginHeight = 5;
shell.setLayout(layout);
final Composite c1 = new Composite(shell, SWT.BORDER);
c1.setBackground(display.getSystemColor(SWT.COLOR_GREEN));
layout = new FillLayout();
layout.marginWidth = layout.marginHeight = 5;
c1.setLayout(layout);
final Composite c2 = new Composite(c1, SWT.BORDER);
c2.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
c2.setLayout(new GridLayout(2, false));
Composite c3 = new Composite(c2, SWT.BORDER);
c3.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
c3.setLayout(new GridLayout(2, false));
for (int i = 0; i < 10; i++) {
Button b = new Button(c3, SWT.PUSH);
b.setText("c3 "+i);
}
final Composite c4 = new Composite(c2, SWT.BORDER);
c4.setBackground(display.getSystemColor(SWT.COLOR_RED));
c4.setLayout(new GridLayout(5, false));
Button b = new Button(c4, SWT.PUSH);
b.setText("CLICK HERE");
b.addListener(SWT.Selection, new Listener() {
int index = 0;
public void handleEvent(Event e) {
Button b = new Button(c4, SWT.PUSH);
b.setText("c4 "+index++);
// In 3.1, you can do:
//shell.layout(new Control[] {b});
// In 3.0 you must do the following (also works in
3.1)
c2.layout();
c4.layout();
// both are needed
// c2.layout is required if red area needs to grow.
// c4.layout is needed because sometimes c4 does not
change size
// (add buttons to existing row) but the new button
still need to
// be displayed
// Note: calling shell.layout() or c1.layout() has
no effect
// here because the children in the FillLayout do
not change size.
}
});
shell.setSize(400, 400);
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
"Marco Kohns" <mek@xxxxxxxxxxxx> wrote in message
news:d4qn8p$5n2$1@xxxxxxxxxxxxxxxxxxx
> Hello everybody,
>
> i have a composite_mother and inside that a toolbar (with two toolitems)
> and another composite_child. When I press one of the toolitems, the
> composite_child changes its content. But I can only see that when I resize
> the window of the application.
>
> What I've tried so far:
>
> composite_child.layout()
> composite_mother.layout()
> shell.layout
> shell.update
> composite_mother.pack()
> composite_child.pack()
>
> But without success...
>
> Thanks for any help!
>