java - tutorial - Evite que SWT ScrolledComposite se coma parte de sus hijos
swt tutorial (4)
¿Qué hice mal?
Aquí hay un extracto de mi código:
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
scrollBox.setExpandHorizontal(true);
mParent = new Composite(scrollBox, SWT.NONE);
scrollBox.setContent(mParent);
FormLayout layout = new FormLayout();
mParent.setLayout(layout);
// Adds a bunch of controls here
mParent.layout();
mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
}
... pero recorta el último botón:
bigbrother82: Eso no funcionó.
SCdF: Intenté tu sugerencia, y ahora las barras de desplazamiento ya no están. Necesito trabajar un poco más en eso.
¿No necesita volver a calcular el tamaño de scrollBox después del diseño?
Este es un obstáculo común cuando se usa ScrolledComposite
. Cuando se vuelve tan pequeño que se debe mostrar la barra de desplazamiento, el control del cliente debe reducirse horizontalmente para dejar espacio para la barra de desplazamiento. Esto tiene el efecto secundario de hacer que algunas etiquetas arrollen líneas, lo que movió los siguientes controles más hacia abajo, lo que aumentó la altura mínima necesaria para el compuesto de contenido.
Necesita escuchar los cambios de ancho en el compuesto de contenido ( mParent
), calcular de nuevo la altura mínima dado el nuevo ancho de contenido y llamar a setMinHeight()
en el compuesto desplazado con una nueva altura.
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
scrollBox.setExpandHorizontal(true);
scrollBox.setExpandVertical(true);
// Using 0 here ensures the horizontal scroll bar will never appear. If
// you want the horizontal bar to appear at some threshold (say 100
// pixels) then send that value instead.
scrollBox.setMinWidth(0);
mParent = new Composite(scrollBox, SWT.NONE);
FormLayout layout = new FormLayout();
mParent.setLayout(layout);
// Adds a bunch of controls here
mParent.addListener(SWT.Resize, new Listener() {
int width = -1;
public void handleEvent(Event e) {
int newWidth = mParent.getSize().x;
if (newWidth != width) {
scrollBox.setMinHeight(mParent.computeSize(newWidth, SWT.DEFAULT).y);
width = newWidth;
}
}
}
// Wait until here to set content pane. This way the resize listener will
// fire when the scrolled composite first resizes mParent, which in turn
// computes the minimum height and calls setMinHeight()
scrollBox.setContent(mParent);
}
Al escuchar los cambios de tamaño, tenga en cuenta que ignoramos los eventos de cambio de tamaño donde el ancho permanece igual. Esto se debe a que los cambios en la altura del contenido no afectan la altura mínima del contenido, siempre que el ancho sea el mismo.
Intenta configurar .setMinWidth y .setMinHeight en ScrolledComposite una vez que se haya realizado el diseño, pasándolo del tamaño del compuesto principal.
Si no me equivoco, debes cambiar el
mParent.layout();
y
mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
para que tengas:
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
ScrolledComposite scrollBox = new ScrolledComposite(parent, SWT.V_SCROLL);
scrollBox.setExpandHorizontal(true);
mParent = new Composite(scrollBox, SWT.NONE);
scrollBox.setContent(mParent);
FormLayout layout = new FormLayout();
mParent.setLayout(layout);
// Adds a bunch of controls here
mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
mParent.layout();
}