Problema de diseño de Eclipse rcp

Tengo un problema con el editor y el diseño de su contenido. Es lo siguiente: hay un editor con funcionalidad de vista previa de impresión, la parte principal del editor está ocupada por el componente PrintPreview de clips de papel, en el lado izquierdo hay un compuesto con algunos botones (ver captura de pantalla 1).

captura de pantalla 1

Como puede ver, PrintPreview se encuentra dentro de ScrolledComposite.

El problema es: cuando estoy cambiando el tamaño de la ventana o las vistas en el editor, la barra de desplazamiento inferior se mueve debajo de las vistas y, por lo tanto, desaparece. No hay forma de desplazarse horizontalmente después (no aparece la barra de desplazamiento del editor). ver captura de pantalla 2 (la barra de desplazamiento inferior se oculta).

Comienza a ocultarse, cuando la altura del editor es menor que la altura del compuesto correcto (hay más widgets debajo del último botón, los acabo de borrar)

captura de pantalla 2

Si estoy reduciendo la ventana, el compuesto derecho nunca pierde su ancho y siempre está visible (vea la captura de pantalla 3: no permite cambiar el tamaño más que eso).

captura de pantalla 3 Los compuestos se crean de la siguiente manera:

   @Override
    public void createPartControl(final Composite parent) {

        GridLayout gridLayout = new GridLayout(2, false);
        parent.setLayout(gridLayout);

        // Scroll area for the print area
        scroll = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        final GridData gridData = new GridData(GridData.FILL_BOTH);
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.widthHint = 1;
        gridData.heightHint = 1;
        scroll.setLayoutData(gridData);
        scroll.setExpandHorizontal(true);
        scroll.setExpandVertical(true);

// Button area
        final Composite buttonArea = new Composite(parent, SWT.FLAT);
        final GridData layoutData = new GridData(SWT.FILL, SWT.TOP, false, false);
        buttonArea.setLayoutData(layoutData);
        gridLayout = new GridLayout(1, false);
        buttonArea.setLayout(gridLayout);

La pregunta es: ¿cómo no evitar que desaparezca la barra de desplazamiento inferior? ¿Puedo tener el mismo comportamiento que el ancho del ancho del compuesto correcto? ¿No es posible cambiar el tamaño menos que la altura del compuesto correcto? ¿O cómo puedo mostrar la barra de desplazamiento en todo el editor si se supera algún límite mínimo de altura?

He intentado diferentes cosas en diferentes compuestos, como establecer la Altura mínima y la Sugerencia de altura, poner el Área de botones en el compuesto desplazado (solo por diversión), etc. Pero nada me ha ayudado.

¿Alguien sabe solución rápida? Gracias.

preguntado el 05 de marzo de 12 a las 10:03

1 Respuestas

Vea esta publicación SO: Evite que SWT scrolledComposite se coma parte de sus hijos

Debe escuchar los cambios de ancho en el compuesto de contenido (mParent), calcular la altura mínima nuevamente dado el nuevo ancho de contenido y llamar a setMinHeight() en el compuesto desplazado con una nueva altura.

Si la publicación anterior no es tan útil como parece, comparta un código ejecutable y de compilación mínimo para replicar el problema. Además, mencione la versión de eclipse/swt, el sistema operativo y la versión de JDK, esto ayuda a analizar el problema.


¡Código de demostración para cambiar el tamaño del evento y la salida!

Código:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class ScrolledCompositeTest
{
    public static void main (String [] args)
    {
          Display display = new Display ();
          Shell shell = new Shell (display);
          shell.setLayout(new FillLayout());

          GridLayout layout = new GridLayout();
          layout.numColumns = 4;

          // set the minimum width and height of the scrolled content - method 2
          final ScrolledComposite sc2 = new ScrolledComposite(shell, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
          sc2.setExpandHorizontal(true);
          sc2.setExpandVertical(true);
          final Composite c2 = new Composite(sc2, SWT.NONE);
          sc2.setContent(c2);
          layout = new GridLayout();
          layout.numColumns = 7;
          c2.setLayout(layout);
          Button b2 = new Button (c2, SWT.PUSH);
          b2.setText("first button");
          sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));

          Button add = new Button (shell, SWT.PUSH);
          add.setText("add children");
          final int[] index = new int[]{0};
          add.addListener(SWT.Selection, new Listener() {
              public void handleEvent(Event e) {
                  index[0]++;
                  Button button = new Button(c2, SWT.PUSH);
                  button.setText("button "+index[0]);
                  sc2.setMinSize(c2.computeSize(SWT.DEFAULT, SWT.DEFAULT));
                  c2.layout();
              }
          });

          shell.open ();
          while (!shell.isDisposed ()) {
              if (!display.readAndDispatch ()) display.sleep ();
          }
          display.dispose ();
     }
}

Salida:

Actual Size

enter image description here

Vertical Resize

enter image description here

Horizontal Resize

enter image description here

contestado el 23 de mayo de 17 a las 13:05

¡Gracias por su respuesta! He probado tu solución y está funcionando. Ya resolví este problema cambiando los datos de diseño del área del botón a grabExcessVerticalSpace=true y agregando GridData a todos los elementos secundarios con verticalAlign=FILL. A primera vista parece tener el mismo comportamiento, probablemente no tan elegante. Salud - Alex K.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.