Domanda

Sto cercando di creare un'applicazione che contiene una scatola StyledText visualizzata all'interno di una ScrolledComposite. Sto avendo difficoltà la visualizzazione di un gran numero di linee nella mia casella StyledText (oltre 2.550 sembra problemi di causa).

La scatola StyledText non deve in se ha una barra di scorrimento, ma deve essere scorrevole tramite lo ScrolledComposite. Come ci sono altre voci sotto e sopra la StyledText che devono essere scorrevole per e non voglio più barre di scorrimento.

Quindi con grandi quantità di dati che hanno un grande (come in altezza) casella StyledText che sembra arrestarsi dopo una certa altezza.

Schermata

Il problema è che lo StyledText dovrebbe essere il più alto è il suo contenuto e non è. La ragione per la sotto gap è che il composito contenente è quello ridimensionamento StyledText riferisce essere la sua altezza, ma questo non è in realtà la sua altezza.

Ecco un pezzo di codice di esempio semplificato per illustrare il mio 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;
    }

}

Aggiornamento: È interessante notare che questo problema si verifica con SWT Etichetta e SWT testo

È stato utile?

Soluzione

Questo è in realtà una limitazione di Windows. Compositi possono essere solo di una certa dimensione in Windows, non più di 32767 (pixel, presumo).

Questa è scoperta per la scrolledComposite perché non è in realtà> 32767, sembra solo per essere. Mentre con la mainComp la dimensione reale è> 32767 e questo è dove ci siamo tagliati fuori.

Inizialmente ho pensato che questo fosse un bug Eclipse e ha presentato un rapporto in cui sono stato informato che questo era un problema di Windows / caratteristica: https://bugs.eclipse.org/bugs/show_bug.cgi?id=333111

Altri suggerimenti

Forse si potrebbe risolvere questo problema andando il contrario e posto le "altre cose" all'interno del StyledText? E poi di conseguenza rendere il rotolo StyledText al posto del ScrolledComposite. StyledText ha il supporto per l'incorporamento di entrambe le immagini e controlli, e si è in grado di implementare ascoltatori (ad esempio VerifyListener) per mantenere l'utente di eliminare l'oggetto incorporato -. Se questo è ciò che si desidera

Ecco alcuni esempi di codice:

Se si desidera che i controlli per guardare meglio che nel secondo esempio, è possibile effettuare i controlli occupano tutta la larghezza dell'area di testo (e ascoltare eventi per quando l'area viene ridimensionata - uso styledText.addListener(SWT.Resize, new Listener() ...).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top