2016-05-06 2 views
0

У меня есть TableViewer, который, как я знаю, всегда будет содержать одну строку данных. Когда у меня есть данные для этой таблицы, я могу позвонить setInputData(...) и передать одному объекту Arrays.asList(...), чтобы таблица правильно отображала одну строку данных.JFace TableViewer - Как установить размер для отображения только одной строки?

Когда у меня нет объекта, я все равно хочу, чтобы таблица имела размер, чтобы отображать только одну строку. Тем не менее, если я использую это: setInputData(new ArrayList<Object>(0)), таблица авто-размера показывает около 3 & полных пустых строк. Как я могу заставить таблицу всегда иметь размер, чтобы отображать только одну строку?

Следует отметить, что я использую GridLayout для Composite, что TableViewer находится как внутри, так и для TableViewer.

Я попытался установить границы для таблицы SWT в TableViewer как размер одного элемента, но это не помогло. Я не нашел подобных вопросов по SO или обычным поиском Google, однако в этом вопросе: TableViewer shrinks to a single row with a scroll bar when new input is set, ассеру удалось показать его таблицу размером в одну строку. К сожалению, мне не хватает репутации. чтобы прокомментировать его, как он это сделал.

EDIT: Добавление некоторых более соответствующий код

final ScrolledComposite scrolledComposite = new ScrolledComposite(parentComposite, SWT.V_SCROLL); 
scrolledComposite.setLayout(new GridLayout()); 
scrolledComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); 
scrolledComposite.setAlwaysShowScrollBars(true); 
scrolledComposite.setExpandHorizontal(true); 
scrolledComposite.setExpandVertical(true); 

TableViewer tableViewer = new TableViewer(scrolledComposite, SWT.FULL_SELECTION | SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL); 
// I'm setting the LabelProvider, ContentProvider here. 
GridData gridData = new GridData(); 
gridData.heightHint = tableViewer.getTable().getItemHeight(); 
tableViewer.getTable().setLayoutData(gridData); 

scrolledComposite.setContent(tableViewer.getControl()); 
scrolledComposite.setMinSize(tableViewer.getTable().getGridLineWidth(), tableViewer.getTable().getItemHeight()); 

И затем, в отдельный метод:

tableViewer.setInputData(objectList); // This may be empty or have exactly one object

+1

Если он работает, когда у вас есть один пункт в таблице это звучит, как это было бы простейшим просто поставить один манекен элемент в таблице, когда он пуст. –

+0

К сожалению, в том месте, где я устанавливаю вход в таблицу, я не знаю тип объекта. Он передается. Поэтому я не могу создать экземпляр нового объекта правильного типа, потому что я не знаю тип в то время, и я не могу дать общий «новый объект()», потому что тогда я получаю ошибки, когда «LabelProvider» пытается сопоставить новый объект. – Neil

+0

Почему таблица встроена в 'ScrolledComposite'? У этого есть свои собственные полосы прокрутки, нет необходимости в 'ScrolledComposite'. –

ответ

0

Для тех, кто прибывает в этой ссылке в поисках решения, строить от ответа Рюдигер Herrmann, в то, что, наконец, работал для меня, чтобы создать TableViewer внутри Composite, который затем помещается внутри ScrolledComposite. (Это было найдено через другую ссылку StackOverflow, в которой указано, что Control необходимо разместить внутри Composite в пределах ScrolledComposite, чтобы он отображался правильно.) Затем Composite необходимо установить ScrolledComposite, как: ScrolledComposite.setContent(Composite). После установки обоих, ScrolledComposite & в Composite Макеты в FillLayout & задающие размер ScrolledComposite быть tableViewer.getTable().computeSize(SWT.DEFAULT, tableViewer.getTable().getItemHeight()), я был в состоянии получить правильную высоту для TableViewer.

После того, как это сделано, после tableViewer.setInput(objectList); называется, я установил размер в TableViewer с: tableViewer.getTable().setSize(tableViewer.getTable().computeSize(tableViewer.getTable().getClientArea().width, tableViewer.getTable().getItemHeight()));

1

Вы можете запросить таблицу, чтобы вычислить его размер для одной строки, как это

Point Site = table.computeSize(SWT.DEFAULT, table.getItemHeight() * 1); 

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

+0

Итак, вот что я пробовал после создания TableViewer: ' GridData gridData = new GridData(); gridData.heightHint = tableViewer.getTable(). GetItemHeight(); tableViewer.getTable(). SetLayoutData (gridData); ' Это, похоже, не помогло, все еще сохраняются авто-размер таблицы, чтобы показать три с половиной пустых строки. – Neil

+0

Возможно, расположение родителя или родного брата таблицы заставляет таблицу игнорировать подсказку и использовать пространство (оставшееся?). Трудно сказать, не видя больше кода. Можете ли вы предоставить самодостаточный фрагмент кода, который показывает проблему? –

+0

Это оказалось немного сложнее, чем я ожидал, я отредактировал исходное сообщение с некоторым соответствующим кодом, который я могу вытащить, сообщите мне, если это имеет смысл (или нет). Благодарю. – Neil

Смежные вопросы