2010-11-02 4 views
5

Problem: Ich benötige eine SWT Tabelle (JFace TableViewer) mit variabler Zeilenhöhe. Tatsächlich löste ich das auf meiner Entwicklungsmaschine (laufendes Ubuntu 10.10). Leider funktioniert das nicht unter Windows oder Mac.SWT Tabelle mit variabler Zeilenhöhe: Arbeiten unter Linux, aber nicht unter Mac/Windows

Anfangs dachte ich, ich benutze die Bibliotheken nicht richtig. Aber jetzt fürchte ich, dass das, was ich tun möchte, unter Windows einfach nicht möglich ist. Ich hoffe jemand hier überzeugt mich sonst.

Um zu reproduzieren: anstatt meinen Code hier bereitzustellen, baute ich ein minimales Programm, um das Problem zu reproduzieren. Ich begann mit dem folgenden Snipplet:

http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet049StyledCellLabelProvider.java

I modifiziert, um die Aktualisierung (Methode) zwei Textzeilen für Verzeichnisse zu erzeugen und eine Zeile für Dateien (eine Umgebung mit variabler Zeilenhöhen zu simulieren):

... 
if (file.isDirectory()) { 
    cell.setText(styledString.toString() + "\n" 
     + styledString.toString()); 
    cell.setImage(IMAGE1); 
} else { 
    cell.setImage(IMAGE2); 
} 
...

Dies funktioniert wie unter Linux, aber unter Windows haben alle Zeilen die gleiche Höhe. Insbesondere ist nur eine Zeile sichtbar.

Als nächstes versuchte ich SWT zu helfen, indem ich measure() intelligenter machte. So schrieb ich measure() wie folgt aus:

protected void measure(Event event, Object element) { 
    if (((File) element).isDirectory()) { 
     event.height = 32; 
    } else { 
     event.height = 16; 
    } 
    super.measure(event, element); 
}

Das Ergebnis: Alle Zeilen die Höhe haben 32. Auch dies funktioniert wie unter Linux gedacht.

Meine Angst ist, dass unter Windows einfach alle Zeilen die gleiche Höhe haben müssen. Das wäre ein Showstopper für mich. Kann jemand das bestätigen, oder besser noch, einen Workaround bereitstellen?

Danke!

+0

Eigentlich könnte ich eine Erklärung für dieses Verhalten, und vielleicht sogar ein Fix (ich habe noch versuchen, diese aus) gefunden: https://bugs.eclipse.org/bugs/show_bug .cgi? id = 148039 – jastram

+0

Vielen Dank für die Antworten. Am Ende habe ich http://sourceforge.net/projects/agilegrid/ benutzt, das auch die Tabelle nativ wie KTable zeichnet. Es ist eine Freude mit ihr zu arbeiten, im Vergleich zu SWT. – jastram

Antwort

2

Ich kann bestätigen, dass auf Win32 Tabellenzeilen nur die gleiche Höhe haben können. Siehe zum Beispiel this bug report. Die Problemumgehung von Fehler 148039 macht setItemHeight() zugänglich, aber das ändert diese Einschränkung nicht.

4

Ich stieß auch auf dieses Problem - ein SWT-Tabellen-Widget, das Zellen unterschiedlicher Höhe unterstützen könnte. Wie der .duckman sagt, können Win32-Tabellenzeilen das nicht tun. Wir haben am Ende das KTable-Widget verwendet. Es verwendet nicht die systemeigenen OS-Tabellen.

http://sourceforge.net/projects/ktable/

Es war für uns in Ordnung, aber es hat ein paar Macken bekam. Zum Glück lässt sich der Quellcode relativ einfach an Ihre Bedürfnisse anpassen.

+0

Das sieht wirklich interessant aus.Wenn ich noch nicht mit AgileGrid refaktoriert hätte, würde ich KTable ausprobieren. – jastram

1

Wir verwenden das Widget "Nebula-Gitter". http://www.eclipse.org/nebula/widgets/grid/grid.php

Es ist außergewöhnlich flexibel. In unserem Fall verwenden wir es, um mehr HTML-Stil-Tabellenfunktionen in Kombination mit einem treeViewer-Widget zu erhalten.

Screenshot alt text

+0

Sind Sie sicher, dass Nebel dieses Problem angeht? Ich glaube, ich habe es überprüft und abgelehnt. Ich bin mir nicht sicher, ob ich es abgelehnt habe, weil es in ALPHA war oder weil es auch die Zeilenhöhenbeschränkungen hatte. Aber ich denke * es war wegen der Probleme mit der Zeilenhöhe. – jastram

+0

Um die variablen Höhen zu bekommen, ist nicht komplett aus der Box, aber es ist sehr geradlinig. Jede Zeile im Grid hat ihr eigenes unabhängiges Höhenattribut. Wo also in einem normalen Tabellen-Widget auf Farbe/Maß, können Sie die Höhe anpassen, aber alle Tabellenelemente sind jetzt die maximale Höhe in Grid, die Sie jedes GridItem.setHeight() anpassen können. In meinem Fall benutze ich den Grid-Tabellen-Viewer und lasse meine Label-Provider-Aktualisierungsmethode die geeignete Höhe für jede Zeile berechnen. Es ist Beta, war aber in den letzten 2+ Jahren oder so sehr stabil für uns. – fisherja

Verwandte Themen