Pregunta

Estoy intentando crear una aplicación que contiene una caja StyledText se muestra dentro de un ScrolledComposite. Estoy teniendo dificultades para mostrar un gran número de líneas en mi caja StyledText (más de 2550 parece que causa problemas).

La caja debe StyledText no es en sí tiene una barra de desplazamiento, pero debe ser desplazable a través de la ScrolledComposite. Ya que hay otros artículos debajo y por encima del StyledText que necesitan ser desplazable hacia y que no quieren que las barras de desplazamiento múltiple.

Por lo tanto, con grandes cantidades de datos que tienen un muy grande (como en altura) Caja StyledText que parece detenerse después de una cierta altura.

Imagen

El problema es que el StyledText debe ser tan alto es su contenido y no lo es. La razón de la diferencia es inferior que el compuesto que contiene es cambiar el tamaño de lo que StyledText informa que su altura, pero esto no es, de hecho, su altura.

Aquí es una pieza de código de ejemplo simplificado para ilustrar mi problema:

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;


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

        ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.V_SCROLL);
        scrolledComposite.setLayout(new FillLayout(SWT.VERTICAL));

            Composite mainComp = new Composite(scrolledComposite, SWT.NONE);
        mainComp.setLayout(new FillLayout(SWT.VERTICAL));

        StyledText styledText = new StyledText(mainComp, SWT.NONE);
        styledText.getContent().setText(bigString());

        mainComp.setSize(mainComp.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        scrolledComposite.setContent(mainComp);
        scrolledComposite.setMinSize(mainComp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);
        scrolledComposite.getVerticalBar().setIncrement(10);


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

    }

    private static String bigString()
    {
        String big = "";

        for(int i=0;i<10000;i++)
        {
            big = big + "hello\r\n";
        }

        return big;
    }

}

Actualización: Es interesante que este problema se produce con la etiqueta SWT y texto SWT

¿Fue útil?

Solución

Esto es realmente una limitación de Windows. Composites solamente pueden ser de un cierto tamaño en ventanas, no hay más de 32767 (píxeles, supongo).

Este es el hallazgo para scrolledComposite porque no es en realidad> 32767, que sólo parece ser. Mientras que con el mainComp el tamaño real es> 32767 y aquí es donde se cortó.

Al principio pensé que esto era un error de Eclipse y presentó un informe donde se me informó que se trataba de un problema de Windows / función: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333111

Otros consejos

Tal vez usted podría resolver este problema por ir al revés y colocar las "otras cosas" dentro de la StyledText? Y a continuación, en consecuencia, hacer que el desplazamiento StyledText en lugar de la ScrolledComposite. StyledText tiene soporte para la incorporación de ambas imágenes y controles, y que son capaces de implementar los oyentes (por ejemplo VerifyListener) para mantener al usuario elimine el objeto incrustado. - si eso es lo que quiere

A continuación, algunos ejemplos de código:

Si desea que sus controles para verse mejor que en el segundo ejemplo, puede hacer que sus controles ocupan todo el ancho del área de texto (y escuchar eventos para cuando se cambia el tamaño del área - el uso styledText.addListener(SWT.Resize, new Listener() ...).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top