Java的SWT:设置Group的大小隐藏其小部件

时间:2015-05-22 13:25:25

标签: java swt

我想在GridLayout中设置一个包含一些小部件的组 我还希望组件的大小是固定大小(250x250),并且它上面的小部件可以容纳(在两列内均匀分布)。
但是当我设置组的大小时,它隐藏了它的小部件。

考虑一下:

public class Gui {

    public static void main(String[] args) {
        Gui g=new Gui();
        g.run();
    }

    private Shell shell;
    private Display display;
    private ChartComposite composite;


    public Gui() {
        display=new Display();
        shell=new Shell(display);
        shell.setSize(500, 500);

        Group group=new Group(shell, SWT.NONE);
        group.setText("Group");
        group.setSize(250,250); // this causes trouble

        GridLayout group_layout=new GridLayout();
        group_layout.numColumns=2;
        group_layout.marginBottom=10;
        group_layout.marginTop=10;
        group.setLayout(group_layout);

        Button b1=new Button(group, SWT.PUSH);
        b1.setText("Button1");

        Button b2=new Button(group, SWT.PUSH);
        b2.setText("Button2");

        Button b3=new Button(group, SWT.PUSH);
        b3.setText("Button3");

        Button b4=new Button(group, SWT.PUSH);
        b4.setText("Button4");
    }

    public void run() {
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

输出:

enter image description here

但是现在看一下当我将呼叫重新定位到setSize()时会发生什么:

public class Gui {

    public static void main(String[] args) {
        Gui g=new Gui();
        g.run();
    }

    private Shell shell;
    private Display display;
    private ChartComposite composite;

    public Gui() {
        display=new Display();
        shell=new Shell(display);
        shell.setSize(500, 500);

        Group group=new Group(shell, SWT.NONE);
        group.setText("Group");

        GridLayout group_layout=new GridLayout();
        group_layout.numColumns=2;
        group_layout.marginBottom=10;
        group_layout.marginTop=10;
        group.setLayout(group_layout);

        Button b1=new Button(group, SWT.PUSH);
        b1.setText("Button1");

        Button b2=new Button(group, SWT.PUSH);
        b2.setText("Button2");

        Button b3=new Button(group, SWT.PUSH);
        b3.setText("Button3");

        Button b4=new Button(group, SWT.PUSH);
        b4.setText("Button4");

        group.setSize(250,250);  // relocated
    }

    public void run() {
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
}

输出:

enter image description here

有没有人对此行为有解释?

正如我所提到的,我需要在添加小部件之前将组的大小设置为(250x250),因此它们可以适当地容纳,如果{{{}我无法完成此操作1}}隐藏我的小部件。

1 个答案:

答案 0 :(得分:1)

通过调用复合layout()方法来计算和应用布局。在你的第一个片段中,这从未完成。调整复合材料的大小也会触发重新布局。这就是为什么在第二个代码段中调用setSize()会触发布局的原因。它在您的第一个代码段中不起作用,因为当您致电setSize()时尚未设置GridLayout。

您可以在设置布局并创建所有子项后调用setSize(),而不是推迟group.layout()调用。

在仅使用布局而不是绝对定位的UI中,对shell.pack()的单次调用将以递归方式触发所有布局。