Layout issue: autogrow label (SWT)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-01 18:40:05

问题


I'm using a GridLayout trying to make a label autogrow without hiding anything of its content. Here's a simple code to test: Everytime I press the button the label text grows larger, but only after I resize the window horizontally I get the correct layout. Is there any way to fix this without having to resize the window? I think I've tried every property and I still can't get this working, it's driving me nuts!

This is what I got

This is how it should be

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;

public class UItest {

    protected Shell shell;
    private Label   label;

    public static void main(String[] args) {
        try {
            UItest window = new UItest();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        shell.setLayout(new GridLayout(1, false));

        Button button = new Button(shell, SWT.NONE);
        button.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent arg0) {
                label.setText(label.getText() + " " + label.getText());
            }
        });
        button.setText("New Button");

        label = new Label(shell, SWT.WRAP);
        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
        label.setText("New Label");

        List list = new List(shell, SWT.BORDER);
        list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

    }

    protected Label getLabel() {
        return label;
    }
}

Thanks for your time.


SOLVED WITH THESE CHANGES:

Button button = new Button(shell, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent arg0) {
        label.setText(label.getText() + " " + label.getText());
        shell.layout(); // ADDED THIS
    }
});
button.setText("New Button");

label = new Label(shell, SWT.WRAP);
// SET HORIZONTAL GRAB ON LABEL (FIRST TRUE IN GridData CONSTRUCTOR)
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
label.setText("New Label");

回答1:


I think, the problem is that the layout is not invalidated when the text changes - try to force a relayouting (by calling getShell().layout(true, true)).



来源:https://stackoverflow.com/questions/3499349/layout-issue-autogrow-label-swt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!