2008-08-29 14 views
12

¿Qué hice mal?Prevenir SWT ScrolledComposite de comer parte de sus hijos

Aquí es 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 lo recorta el último botón: alt text

bigbrother82: Eso no funcionó.

SCdF: Intenté su sugerencia, y ahora las barras de desplazamiento se han ido. Necesito trabajar un poco más en eso.

+0

Hola Jeremy, acabo de darme cuenta ahora de que mi sugerencia no funcionó. ¿Has tenido algo de suerte con esto? – SCdF

+0

(por cierto, si comenta mi respuesta, aparecerá en mis respuestas y no me la perderé) – SCdF

Respuesta

12

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 contenido compuesto (mParent), calcular la altura mínima nuevamente dado el nuevo ancho del contenido y llamar al 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 cualquier evento de cambio de tamaño donde el ancho permanezca igual. Esto se debe a que los cambios en la altura del contenido no afectan a la altura mínima del contenido, siempre que el ancho sea el mismo.

+0

Gracias, esto resolvió el problema. – Jeremy

0

¿No necesita volver a calcular el tamaño de scrollBox después del diseño?

2

Si no me equivoco lo que necesita para cambiar la

mParent.layout(); 

y

mParent.setSize(mParent.computeSize(SWT.DEFAULT, SWT.DEFAULT, true)); 

para que tenga:

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(); 
} 
0

Inténtelo de .setMinWidth y .setMinHeight en el ScrolledComposite una vez que se ha hecho el diseño, pasándolo del tamaño del compuesto principal.

Cuestiones relacionadas