Диалог Eclipse RCP: Большое текстовое поле не прокручивается - вместо этого создается огромное диалоговое окно! - PullRequest
1 голос
/ 05 июля 2010

Я уже давно трахаюсь с этим, и, похоже, никуда не денусь. Я перепробовал все примеры, которые я могу найти в Интернете, но ничего не получается! Я не смог найти много по этой проблеме, которая заставляет меня думать, что я упускаю что-то базовое. , .

В моей программе Eclipse RCP я хочу отобразить диалоговое окно, в котором будет показан список ошибок, произошедших при загрузке файла данных. Я переопределил TitleAreaDialog и просто хочу отобразить прокручиваемый текст, содержащий список ошибок и кнопку ОК.

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

Как предотвратить слишком большой размер диалогового / текстового поля? Чего мне не хватает?

Спасибо за вашу помощь !!
-Christine

...

Вот простая программа, показывающая мой диалог:

import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.swt.*;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;


public class ScrollableDialogRunner {

    public static void main(String[] args) {
        System.out.println("starting");
        Display display = new Display ();
        Shell shell = new Shell (display);

        String errors = "one\ntwo\nthree\nfour\nfive\n";
        for(int i = 0; i < 5; i++){
            errors += errors;
        }

        ScrollableDialog dialog = new ScrollableDialog(shell, "Errors occurred during load", "The following errors occurred while loaded file 'x.data'", errors);
        dialog.open();
    }
}


class ScrollableDialog extends TitleAreaDialog {
    private String title;
    private String text;
    private String scrollableText;

    public ScrollableDialog(Shell parentShell, String title, String text, String scrollableText) {
        super(parentShell);
        this.title = title;
        this.text = text;
        this.scrollableText = scrollableText;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        GridLayout layout = new GridLayout();
        layout.numColumns = 1;
        parent.setLayout(layout);

        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;

        Text scrollable = new Text(parent, SWT.BORDER | SWT.V_SCROLL);
        scrollable.setLayoutData(gridData);
        scrollable.setText(scrollableText);

        return parent;
    }

    @Override
    public void create() {
        super.create();

        setTitle(title);
        setMessage(text, IMessageProvider.ERROR);
    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        Button okButton = createButton(parent, OK, "OK", true);
        okButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                close();
            }
        });
    }

    @Override
    protected boolean isResizable() {
        return false;
    }
}

1 Ответ

3 голосов
/ 05 июля 2010

Назначить размер для диалога;в противном случае диалоговое окно будет отображать дочерние элементы, запрашивая у них «предпочтительный» размер (который является бесконечным для текстового виджета), и соответственно изменяет свой размер.

[ПРАВКА]Смотрите мои комментарии для деталей.

class ScrollableDialog extends TitleAreaDialog {
    private String title;
    private String text;
    private String scrollableText;

    public ScrollableDialog(Shell parentShell, String title, String text, String scrollableText) {
        super(parentShell);
        this.title = title;
        this.text = text;
        this.scrollableText = scrollableText;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea (parent); // Let the dialog create the parent composite

        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;
        gridData.grabExcessVerticalSpace = true; // Layout vertically, too! 
        gridData.verticalAlignment = GridData.FILL;

        Text scrollable = new Text(composite, SWT.BORDER | SWT.V_SCROLL);
        scrollable.setLayoutData(gridData);
        scrollable.setText(scrollableText);

        return composite;
    }

    @Override
    public void create() {
        super.create();

        // This is not necessary; the dialog will become bigger as the text grows but at the same time,
        // the user will be able to see all (or at least more) of the error message at once
        //getShell ().setSize (300, 300);
        setTitle(title);
        setMessage(text, IMessageProvider.ERROR);

    }

    @Override
    protected void createButtonsForButtonBar(Composite parent) {
        Button okButton = createButton(parent, OK, "OK", true);
        okButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                close();
            }
        });
    }

    @Override
    protected boolean isResizable() {
        return true; // Allow the user to change the dialog size!
    }
}
...