How do I place a label at the bottom of a window in Java/SWT

Viewed 126

I am writing a Java GUI application using SWT, which shows a large table with hundreds of rows. At the bottom of the window, I want to have a fixed label showing some status information.

My program looks like this:

public class Test {

public static void main(String[] args) {
    Display display = new Display();

    Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.V_SCROLL);
    FillLayout fillLayout = new FillLayout();
    shell.setLayout(fillLayout);
    // GridLayout gridLayout = new GridLayout();
    // shell.setLayout(gridLayout);    
    final Table table = new Table(shell, SWT.NONE);
    table.setHeaderVisible(true);
    final String header[] = {"Feld 1","Feld 2","Feld 3"};
    table.setLinesVisible(true);
    for (int i = 0; i < 3; i++) {
      TableColumn column = new TableColumn(table, SWT.NONE);
      column.setText(header[i]);
      column.setWidth(100);
    }
    for (int i = 0; i < 4; i++) {
      TableItem item = new TableItem(table, SWT.NONE);
      item.setText(new String[] { "a" + i, "b" + i, "c" + i });
    }
    GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
    gridData.verticalSpan = 3;
    table.setLayoutData(gridData);

    Label statusLine = new Label(shell, SWT.NULL);
    statusLine.setText("This shall be the status line");

    gridData = new GridData(GridData.VERTICAL_ALIGN_END);
    gridData.horizontalSpan = 3;
    statusLine.setLayoutData(gridData);
            
    shell.setSize(400,100);
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }

}

If I am using a GridLayout, the label is located below the table, but depending on the size of the table and the window size, the label is not visible. If I enlarge the window, the label appears, but does not stay at the bottom of the window but always just below the table. And the table is not scrollable, i.e. I cannot see the bottom lines of my large table.

If I am using the FillLayout, the table is scrollable, but the label occupies the right half of my window.

Any advise, how I force my label at the bottom of my window and still have table scrollable?

1 Answers

With GridLayout you can do something like:

GridLayout gridLayout = new GridLayout();
shell.setLayout(gridLayout);

.... your table code

// To get the table to scroll you have to give a height hint

GridData gridData = new GridData(SWT.FILL, SWT.TOP, false, false);
gridData.heightHint = 100;
table.setLayoutData(gridData);

Label statusLine = new Label(shell, SWT.NULL);
statusLine.setText("This shall be the status line");

// Set the label grid data to grab the remaining space and put the label at the bottom

gridData = new GridData(SWT.FILL, SWT.END, true, true);
statusLine.setLayoutData(gridData);

shell.setSize(400, 200);

Or have the table grab the excess vertical space:

GridData gridData = new GridData(SWT.FILL, SWT.TOP, false, true);
gridData.heightHint = 100;
table.setLayoutData(gridData);

Label statusLine = new Label(shell, SWT.NULL);
statusLine.setText("This shall be the status line");

gridData = new GridData(SWT.FILL, SWT.END, true, false);
statusLine.setLayoutData(gridData);
Related