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
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. –
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
Warum ist die Tabelle in einem 'ScrolledComposite' eingebettet? Es hat seine eigenen Scrollbalken, es gibt keinen "ScrolledComposite". –