NB! Esta respuesta se basa en Eclipse RAP, que podría comportarse de manera diferente a SWT normal.
Estaba luchando con el mismo problema hace un par de días. Tenía dos ScrolledComposite
s en la misma página y necesitaba que el izquierdo no ocupara más espacio del necesario (incluso si el espacio estuviera disponible).
Mientras probando diferentes soluciones Noté que el comportamiento de un ScrolledComposite
depende de su LayoutData
de la siguiente manera:
- Si el
layoutData
se establece en new GridData(SWT.LEFT, SWT.TOP, false, true)
, entonces el ScrolledComposite
mantendrá a que se destina el tamaño independientemente de los padres Composite
cambios de tamaño.
- Si el
layoutData
está configurado en new GridData(SWT.LEFT, SWT.TOP, true, true)
, entonces el ScrolledComposite
se contraerá/expandirá según los cambios de tamaño del elemento primario Composite
. Esto también incluye ampliar el ancho deseado (lo que significa que las columnas se mantienen iguales).
Sobre la base de este comportamiento yo era capaz de resolver el problema mediante la adición de un oyente cambio de tamaño para los padres Composite
que cambia el layoutData
del ScrolledComposite
la izquierda en base a la matriz Composite size
.
Este enfoque se ilustra en el siguiente ejemplo:
public class LayoutingScrolledComposites extends AbstractEntryPoint {
public void createContents(Composite parent) {
parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
parent.setLayout(new GridLayout(2, false));
ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
Composite c1 = new Composite(sc1, SWT.BORDER);
sc1.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
c1.setLayout(new GridLayout(3, false));
sc1.setContent(c1);
Label l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
l1 = new Label (c1, SWT.BORDER);
l1.setText("Some text");
c1.setSize(c1.computeSize(SWT.DEFAULT, SWT.DEFAULT));
ScrolledComposite sc2 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
sc2.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, true));
Composite c2 = new Composite(sc1, SWT.BORDER);
c2.setLayout(new GridLayout(3, false));
sc2.setContent(c2);
Label l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
l2 = new Label (c2, SWT.BORDER);
l2.setText("Some text");
c2.setSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
parent.addListener(SWT.Resize, new Listener() {
public void handleEvent(Event e) {
int sc1_x = sc1.getContent().getSize().x;
int sc2_x = sc2.getContent().getSize().x;
//Enable/Disable grabExcessHorizontalSpace based on whether both sc's would fit in the shell
if (LayoutingScrolledComposites.this.getShell().getSize().x > sc1_x+sc2_x) {
if (((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) {
//sc1 does not change width in this mode
((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=false;
}
} else {
if (!((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace) {
//sc1 changes width in this mode
((GridData)sc1.getLayoutData()).grabExcessHorizontalSpace=true;
}
}
parent.layout(); //Needed so that the layout change would take effect during the same event
}
});
}
}
Sin embargo este enfoque sí me parece un poco demasiado solución "hacker". Por lo tanto, me encantaría ver un mejor enfoque.
Tengo el mismo problema, ¿alguna vez encontró una solución? –