调整SWT表的大小

时间:2016-11-24 08:37:35

标签: java eclipse swt

我有一个包含表格和按钮组件的向导。当我点击添加按钮时,我从对话框窗口中选择应该将哪些项目添加到表格中。我确认项目,然后这些项目出现在带有滚动条的表格中。但是,如果我调整向导的大小,则会更改表的大小。如何解决?

调整大小之前的表:

enter image description here

向导调整大小后的表

Table afterresize

Composite compositeArea = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 3;
compositeArea.setLayout(layout);
Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
new TableColumn(someList, SWT.NULL);
table.setLayoutData(new GridData(HORIZONTAL_ALIGN_FILL | GRAB_HORIZONTAL));

1 个答案:

答案 0 :(得分:1)

**请注意,不建议使用HORIZONTAL_ALIGN_FILLGRAB_HORIZONTAL。相反,您应该使用public GridData(int, int, boolean, boolean)构造函数。 **

轻松简化您的代码段(复合材料上只有一列,只有一个默认表列 - 请参阅下面的完整代码):

// ...
final Composite compositeArea = new Composite(parent, SWT.NONE);
compositeArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
compositeArea.setLayout(new GridLayout());

final Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
table.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
// ...

enter image description here

...我们发现Table不适合可用空间或按预期显示滚动条,并且Shell调整大小时会出现同样的情况。

在回答您的问题时,这是因为Table的布局数据不知道如何垂直布局 - 您只指定了两个水平 style attributes。

如果我们改为使用建议的构造函数:

table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

enter image description here

... Table使可用空间正确,显示滚动条,并在Shell调整大小时正确更新。使用布局数据,我们告诉Table填充可用的水平空间,Table将在必要时显示滚动条。

完整示例:

public class TableResizeTest {

    private final Display display;
    private final Shell shell;

    public TableResizeTest() {
        display = new Display();
        shell = new Shell(display);
        shell.setLayout(new FillLayout());
        shell.setMaximized(true);

        final Composite parent = new Composite(shell, SWT.NONE);
        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        parent.setLayout(new GridLayout());

        // -- snippet --
        final Composite compositeArea = new Composite(parent, SWT.NONE);
        compositeArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        compositeArea.setLayout(new GridLayout());

        final Table table = new Table(compositeArea, SWT.BORDER | SWT.V_SCROLL);
        // table.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        // -------------

        for (int i = 0; i < 20; ++i) {
            new TableItem(table, SWT.NONE).setText(String.valueOf(i));
        }
    }

    public void run() {
        shell.setSize(300, 300);
        shell.open();

        while (!shell.isDisposed()) {
            if (display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }

    public static void main(final String... args) {
        new TableResizeTest().run();
    }

}