2016-05-06 14 views
0

Ich habe einen TableViewer, von dem ich weiß, dass er immer eine Datenzeile enthalten wird. Wenn ich Daten für diese Tabelle habe, kann ich setInputData(...) aufrufen und das eine Objekt mit Arrays.asList(...) übergeben, damit die Tabelle korrekt die eine Datenzeile anzeigt.JFace TableViewer - Wie wird die Größe so eingestellt, dass nur eine Zeile angezeigt wird?

Wenn ich das Objekt nicht habe, möchte ich immer noch, dass die Tabelle so skaliert wird, dass nur eine Zeile angezeigt wird. Wenn ich dies jedoch verwende: setInputData(new ArrayList<Object>(0)), wird die Tabelle automatisch so skaliert, dass sie ungefähr 3 & Halbzeilen anzeigt. Wie kann ich sicherstellen, dass die Tabelle immer so groß ist, dass nur eine Zeile angezeigt wird?

Ich sollte erwähnen, dass ich GridLayout für den Composite verwenden, dass der TableViewer innerhalb sowie für den TableViewer ist.

Ich habe versucht, die Grenzen für die SWT-Tabelle innerhalb der TableViewer auf die Größe eines einzelnen Elements zu setzen, aber das hat nicht geholfen. Ich habe keine ähnlichen Fragen zu SO oder durch eine allgemeine Google-Suche gefunden, aber in dieser Frage: TableViewer shrinks to a single row with a scroll bar when new input is set konnte der Fragesteller seine Tabelle so skalieren, dass eine Zeile angezeigt wurde. Leider habe ich nicht genug Rep. um zu fragen, wie er das gemacht hat.

EDIT: Hinzufügen einiger relevanter Code

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()); 

Und dann, in einem separaten Verfahren:

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

+1

Wenn es funktioniert, wenn Sie ein Element in der Tabelle haben es klingt wie es am einfachsten, nur wäre eine Attrappe zu setzen Element in der Tabelle, wenn es leer ist. –

+0

Leider weiß ich an der Stelle, an der ich die Eingabe in die Tabelle gesetzt habe, den Typ des Objekts nicht. Es wird weitergegeben. Ich kann also kein neues Objekt vom richtigen Typ instantiieren, weil ich den Typ zu der Zeit nicht kenne und ich kann kein generisches 'neues Objekt()' geben, weil dann Fehler auftreten, wenn der LabelProvider versucht, das neue Objekt zuzuordnen. – Neil

+0

Warum ist die Tabelle in einem 'ScrolledComposite' eingebettet? Es hat seine eigenen Scrollbalken, es gibt keinen "ScrolledComposite". –

Antwort

0

zu jedem benutzt Ankunft nach einer Lösung suchen, Gebäude weg von Rüdiger Herrmann der Antwort, was für mich schließlich arbeitete, war die TableViewer in einem Composite zu schaffen, die dann in der platziert ScrolledComposite. (Dies wurde durch einen anderen StackOverflow-Link gefunden, der besagt, dass ein Control innerhalb eines Composite innerhalb der ScrolledComposite platziert werden muss, damit es richtig angezeigt wird.) Dann muss der Composite der ScrolledComposite wie eingestellt werden: ScrolledComposite.setContent(Composite). Nachdem beide Einstellung, die ScrolledComposite & die Composite Layouts zu FillLayout & die Größe der ScrolledComposite Einstellung tableViewer.getTable().computeSize(SWT.DEFAULT, tableViewer.getTable().getItemHeight()) zu sein, ich war in der Lage die richtige Höhe für die TableViewer zu bekommen.

Sobald das erledigt, nachdem tableViewer.setInput(objectList); genannt wird, habe ich die Größe der TableViewer mit: tableViewer.getTable().setSize(tableViewer.getTable().computeSize(tableViewer.getTable().getClientArea().width, tableViewer.getTable().getItemHeight()));

1

Sie die Tabelle abfragen kann seine Größe für eine Zeile zu berechnen, wie diese

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

Als nächstes müssen Sie dem Layout mitteilen, dass es so viel Platz für die Tabelle reservieren soll. In einem GridLayout zum Beispiel unter diesem Link gridData.heightHint

+0

So habe ich es versucht, nachdem ich den TableViewer erstellt habe: ' GridData gridData = new GridData(); gridData.heightHint = tableViewer.getTable(). GetItemHeight(); tableViewer.getTable(). SetLayoutData (gridData); ' Das schien nicht zu helfen, die Tabelle wird immer noch automatisch skaliert, um dreieinhalb Leerzeilen anzuzeigen. – Neil

+0

Möglicherweise bewirkt das Layout eines übergeordneten oder untergeordneten Elements der Tabelle, dass die Tabelle den Hinweis ignoriert und das (verbleibende?) Leerzeichen verwendet. Schwer zu sagen, ohne mehr Code zu sehen. Können Sie ein eigenständiges Code-Snippet bereitstellen, das das Problem anzeigt? –

+0

Das ist etwas komplizierter, als ich erwartet habe. Ich habe den ursprünglichen Beitrag mit relevantem Code bearbeitet, den ich herausziehen kann, lassen Sie mich wissen, ob es Sinn macht (oder nicht). Vielen Dank. – Neil