Создайте пустую таблицу с определенной высотой и перерисуйте ее при нажатии кнопки в SWT

Я хочу создать пустую таблицу SWT с 2-3 пустыми строками. Также я хочу заполнить эту таблицу данными при нажатии кнопки.

Из того, что я нашел в Интернете, невозможно создать таблицу с пустыми строками. Если мне нужны пустые строки, мне нужно будет добавить некоторые фиктивные данные, которые я не хочу (конкретная высота 2-3 строк хороша, это хорошо). Есть ли другой способ?

Предпочтительно, чтобы у меня была таблица с высотой заголовка + 3 строки, которая сохраняет эту высоту и обязательно добавляет полосы прокрутки. Как я могу этого добиться?


Мой макет для таблицы настроен следующим образом:

Group tableGroup = new Group(parent, SWT.SHADOW_OUT);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 5;
gridLayout.marginHeight = 5;
tableGroup.setLayout(gridLayout);
tableGroup.setText("Test");

Composite tableComp = new Composite(tableGroup, SWT.NONE);

TableViewerBuilder tableViewerBuilder = new TableViewerBuilder(tableComp, SWT.BORDER | SWT.NO_SCROLL | SWT.V_SCROLL);

tableViewer = tableViewerBuilder.getTableViewer();

GridData gridData = new GridData();
gridData.heightHint = tableViewer.getTable().getHeaderHeight()
        + (5 * tableViewer.getTable().getItemHeight());

tableGroup.setLayoutData(gridData);

Примечание. TableViewerBuilder просто создает новый TableViewer и устанавливает TableColumnLayout в table.getParent().


person XtremeBaumer    schedule 06.04.2018    source источник


Ответы (2)


Размер и расположение виджетов в SWT контролируются менеджерами компоновки. Поэтому вам нужно дать указание менеджеру по расположению таблицы придать ей желаемую высоту.

Если родительская таблица использует GridLayout, вы можете использовать подсказки, чтобы повлиять на вычисление размера менеджера компоновки.

parent.setLayout( new GridLayout( 1, false ) );
...
Table table = new Table( parent, SWT.NONE );
GridData gridData = new GridData();
gridData.heightHint = table.getHeaderHeight() + ( 3 * table.getItemHeight() );
table.setLayoutData( gridData );

В приведенном выше примере макету сетки предлагается зарезервировать высоту, в три раза превышающую высоту элемента, плюс место для строки заголовка для таблицы.

Обратите внимание, что getItemHeight() может измениться после добавления элементов, и в этом случае вам нужно будет настроить подсказку по высоте и изменить макет.

person Rüdiger Herrmann    schedule 06.04.2018
comment
Я мог бы использовать ваш код для увеличения размера Group, но таблица не захватит лишнее пространство. - person XtremeBaumer; 06.04.2018
comment
Вам может потребоваться создать GridData с new GridData( SWT.FILL, SWT.FILL, true, true ), если вы хотите, чтобы таблица использовала избыточное пространство. См. также здесь общее введение в макеты SWT: eclipse.org /articles/Article-Understanding-Layouts/ - person Rüdiger Herrmann; 06.04.2018

Принятый ответ очень помог мне достичь результата. Тем не менее, здесь я предоставляю окончательное решение, которое сработало для меня:

Group tableGroup = new Group(parent, SWT.SHADOW_OUT);
FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
fillLayout.marginWidth = 5;
fillLayout.marginHeight = 5;
tableGroup.setLayout(fillLayout);

data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);

tableGroup.setText("Test");

Composite tableComp = new Composite(tableGroup, SWT.NONE);

TableViewerBuilder tableViewerBuilder = new TableViewerBuilder(tableComp,
        SWT.BORDER | SWT.NO_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);

tableViewer = tableViewerBuilder.getTableViewer();
tableViewer.setContentProvider(OpenFigiResponseContentProvider.getInstance());

data.heightHint = tableViewer.getTable().getHeaderHeight()
        + (5 * tableViewer.getTable().getItemHeight());
tableGroup.setLayoutData(data);
tableViewer.getTable().setLayoutData(data);

Я получаю таблицу, которая полностью заполняет Group

person XtremeBaumer    schedule 06.04.2018