Есть ли у SWT StyledText ограничение по высоте? - PullRequest
3 голосов
/ 22 декабря 2010

Я пытаюсь создать приложение, которое содержит поле StyledText, отображаемое в ScrolledComposite.У меня возникают проблемы с отображением большого количества строк в моем поле StyledText (более 2550, кажется, вызывает проблемы).

Поле StyledText само по себе не должно иметь полосу прокрутки, а должно быть прокручиваемым через ScrolledComposite.Так как есть другие элементы ниже и выше StyledText, которые нужно прокручивать, и я не хочу нескольких полос прокрутки.

Следовательно, при больших объемах данных у меня есть очень большое (как по высоте) поле StyledText, котороекажется, останавливается после определенной высоты.

Screenshot

Проблема в том, что StyledText должен быть таким же высоким, как и его содержимое, а это не так.Причина этого разрыва заключается в том, что содержащий композит изменяет размер, как сообщает StyledText, на его высоту, но на самом деле это не его высота.

Вот фрагмент упрощенного примера кода, иллюстрирующий мою проблему:

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;
    }

}

Обновление. Интересно, что эта проблема возникает с меткой SWT и текстом SWT

Ответы [ 2 ]

4 голосов
/ 23 декабря 2010

На самом деле это ограничение Windows.Композиты могут быть только определенного размера в окнах, не более 32767 (я полагаю, пикселей).

Это находка для scrolledComposite, потому что на самом деле это не> 32767, это просто кажется.Принимая во внимание, что с mainComp фактический размер составляет> 32767, и именно здесь мы были отрезаны.

Изначально я думал, что это ошибка Eclipse, и подал отчет, где мне сообщили, что это проблема / особенность Windows:https://bugs.eclipse.org/bugs/show_bug.cgi?id=333111

0 голосов
/ 12 августа 2011

Возможно, вы могли бы решить эту проблему, обойдя другой путь и поместив свои "другие вещи" в StyledText?И затем последовательно сделайте прокрутку StyledText вместо ScrolledComposite.StyledText поддерживает встраивание изображений и элементов управления, и вы можете реализовать прослушиватели (например, VerifyListener), чтобы пользователь не мог удалить внедренный объект - если это то, что вам нужно.

Вот примеркод:

Если вы хотите, чтобы ваши элементы управления выглядели лучше, чем во втором примере, вы можете сделатьэлементы управления занимают всю ширину текстовой области (и прослушивают события, когда размер области изменяется - используйте styledText.addListener(SWT.Resize, new Listener() ...).

...