SWT:垂直分离器太高;水平太短;表太窄了

时间:2012-02-10 20:47:20

标签: java user-interface swt

我是一名SWT新手,并且在我的用户界面看起来像我想要它时遇到了一些麻烦。请考虑以下代码,从SWT片段拼凑而成:

    Display.setAppName("App Name");

    Display display = new Display();

    Shell shell = new Shell(display);
    GridLayout shellLayout = new GridLayout();
    shellLayout.numColumns = 1;
    shell.setLayout(shellLayout);

    Group group = new Group(shell, SWT.DEFAULT);
    RowLayout groupLayout = new RowLayout();
    group.setLayout(groupLayout);

    for (int i = 0; i < 3; i++)
        new Button(group, SWT.PUSH).setText("ABC" + i);

    new Label(group, SWT.SEPARATOR | SWT.VERTICAL);

    for (int i = 0; i < 3; i++)
        new Button(group, SWT.PUSH).setText("ABC" + i);

    new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);

    Table table = new Table(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
    table.setLinesVisible(true);
    table.setHeaderVisible(true);
    GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
    table.setLayoutData(gridData);

    for (String title : new String[] { "A", "B", "C", "D", "E", "F", "G" })
        new TableColumn(table, SWT.NONE).setText(title);

    for (int i = 0; i < 128; i++) {
        TableItem item = new TableItem (table, SWT.NONE);
        item.setText(0, "123");
        item.setText(1, "234");
        item.setText(2, "345");
        item.setText(3, "456");
        item.setText(4, "567");
        item.setText(5, "678");
        item.setText(6, "789");
    }

    for (TableColumn column : table.getColumns())
        column.pack();

    shell.pack();
    shell.open();

    while (shell.isDisposed() != true)
        if (display.readAndDispatch() != true)
            display.sleep();

    display.dispose();

运行时,显示的结果会出现以下问题:

  1. 垂直分隔符大约是按钮的两倍“高”。网格布局中的顶行如下所示:
  2. ABC1 ABC2 ABC3 | ABC1 ABC2 ABC3
                   |
    

    我想让分隔符与按钮一样高。

    1. 水平分隔符约为屏幕宽度的1/10。如何让它扩展到网格中行的整个宽度?

    2. 表的列只与它们包含的文本一样宽。这导致表格的宽度约为窗口宽度的1/2。我希望表的宽度(以及扩展列的宽度)增长和缩小以匹配窗口的宽度。任何一点都可以指出我如何做到这一点的正确方向?

2 个答案:

答案 0 :(得分:4)

需要告知水平标签要占用更多空间;

Label temp = new Label(shell, SWT.SEPARATOR | SWT.HORIZONTAL);
temp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

对column.pack()的调用正在改变列宽以匹配数据。如果要将它们设置为显式大小,则需要在Column对象上实际设置属性,而不是仅使用新Column创建属性。要使用窗口和表动态调整所有列的大小,需要为表编写ResizeListener。否则,无论表格大小如何,列都会保持不变。

答案 1 :(得分:1)

可以使用布局数据设置垂直分隔符的高度。

Button button = null;
for (int i = 0; i < 3; i++) {
    button = new Button(group, SWT.PUSH);
    button.setText("ABC" + i);
}

Label verticalSeparator = new Label(group, SWT.SEPARATOR | SWT.VERTICAL);
RowData layoutData = new RowData();
layoutData.height = button.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
verticalSeparator.setLayoutData(layoutData);