# Suche TreeTable-Komponente



## Alloc (26. Mrz 2009)

Hi,

ich bin zur Zeit auf der Suche nach einer geeigneten Komponente für ein Projekt. Und zwar bräuchte ich eine TreeTable (ja, davon hab ich schon einige angeschaut), die Zellen verbinden kann. Ich habe eine einfache Struktur mit zwei Ebenen, bei der in der oberen Eben nur ein längerer Name steht und in der zweiten Ebene sind dann zu dem jeweiligen Namen einige Dokumente gelistet, die verschiedene Eigenschaften haben (zB Seitenanzahl, Jahr, Datum ...). Wenn ich nun in der oberen Ebene für den Namen einfach nur die erste Spalte hernehme, die ich auch in der zweiten Ebene verwende, dann müsste ich entweder die erste Spalte seeeehr breit machen, damit alles reinpasst, wodurch in der zweiten Ebene die erste Spalte nur zu einem Bruchteil genutzt würde und der Rest sehr weit rausgeschoben wird. Oder die erste Spalte sehr schmal, so dass es in der zweiten Ebene passt, dann würde aber sehr viel von den Namen abgeschnitten ;( 

Wenn ich nun einen TreeTable hätte, welcher in der ersten Ebene nur eine Spalte hat und in der zweiten entsprechend mehr (geht wohl gegen 10 - 15), dann wäre das Problem erschlagen. Allerdings hab ich bis jetzt nur eine Komponente gefunden (zB Hierarchical Table von JIDE Software), die das könnte, welche ich allerdings nicht nutzen kann, da diese kostenpflichtig ist und ich das Programm in meiner Freizeit für einen gemeinnützigen Verein entwickel.

Genau genommen muss es auch nicht zwangsweise ein TreeTable sein, aber irgendwie eine komfortable Möglichkeit, diese Hierarchie zu realisieren =)
Vielleicht hat hier ja jemand Ideen bzw kennt solche Komponenten.

Grüße,
Chris


----------



## André Uhres (26. Mrz 2009)

Alloc hat gesagt.:


> Und zwar bräuchte ich eine TreeTable (ja, davon hab ich schon einige angeschaut), die Zellen verbinden kann.


Versuch's mal hiermit: TreeTable - Byte-Welt Wiki


----------



## Alloc (27. Mrz 2009)

Hi André,

danke erstmal für die Antwort, das sieht soweit erstmal nicht schlecht aus. Vor allem durch die Klasse UIMultiSpan. Allerdings ist die "Dokumentation" doch etwas spärlich 
Gibt es dafür zufällig irgendwo weitere Infos?

Ansonsten muss ich das wohl einfach mal der Reihe nach durchprobieren. Wie man allerdings Code mit 0 Zeilen JavaDoc schreiben kann ist mir eigentlich schleierhaft :bahnhof: 

Grüße,
Chris


----------



## André Uhres (27. Mrz 2009)

Alloc hat gesagt.:


> Ansonsten muss ich das wohl einfach mal der Reihe nach durchprobieren.


Chris, soviel ist ja nicht in dieser einfachen TreeTable drin. Ich denke, du wirst schnell dadurch sein.


Alloc hat gesagt.:


> Wie man allerdings Code mit 0 Zeilen JavaDoc schreiben kann ist mir eigentlich schleierhaft


Bin leider kommentarfaul, das sollte ich wirklich ändern.
Gruß,
André


----------



## Alloc (27. Mrz 2009)

André Uhres hat gesagt.:


> Bin leider kommentarfaul, das sollte ich wirklich ändern.


Ach, ist von dir ... 
Aber ich kenn das Problem ... seit ich aber das Projekt in Java mach hab ich einfach in Eclipse in den Regeln eingestellt, dass er mir Warnungen spucken soll, wenn irgendwo bei ner Klassendef oder ner Public-Methode der JavaDoc-Kommentar fehlt, das hilft dann, wenn man immer drauf aus ist, möglichst keine Warnings zu produzieren 

Grüße,
Chris


----------



## André Uhres (27. Mrz 2009)

Alloc hat gesagt.:


> Ach, ist von dir ...


Nicht ganz. Die Idee von der TreeTable stammt von Alexandru Toth, ich habe seinen Code aber noch mehr ausgebaut. Die Idee vom Multispan stammt von der MultiSpanCellTable, allerdings habe ich nur das Nötigste dort rausgepickt und angepasst. Beide Beispiele findest du im Web.


----------



## byte (27. Mrz 2009)

Ansonsten gibts noch den JXTreeTable aus der SwingX Library.


----------



## Ebenius (27. Mrz 2009)

byto hat gesagt.:


> Ansonsten gibts noch den JXTreeTable aus der SwingX Library.


Die kann doch keine verbundenen Zellen, oder hab ich da was verpasst?

Ebenius


----------



## Alloc (27. Mrz 2009)

Ebenius hat gesagt.:


> Die kann doch keine verbundenen Zellen, oder hab ich da was verpasst?


Mit der hatte ich schon ein bisschen rumgespielt. Dabei wäre mir aber nichts derartiges aufgefallen (weder in der Doc noch direkt im Code).

Chris


----------



## Alloc (28. Mrz 2009)

Hi André,

habe mir gerade mal den Code von dir runtergeladen und das Testprog ausgeführt. Was mir noch nicht so ganz klar ist, ist wo was gemacht wird (vor allem, da da Beispielcode vermischt ist mit dem Code der Komponenten). Außerdem sieht das für mich so aus, als ob die erste Spalte eine feste Breite hat (durchgehend durch alle Zeilen, im Beispielprog die Spalte mit "Welt", "Europa", etc). Ich will ja, dass genau dies nicht der Fall ist, da eben speziell diese erste Spalte sehr umfangreich werden wird in der ersten Baumebene 
Naja, ich schaus mir wohl die Tage nochmal an und ansonsten muss ich mir wohl was zusammenstückeln, eventuell brauch ich ja auch nur den MultiSpan-Code zu klauen und auf eine andere TreeTable zu portieren 

Grüße,
Chris


----------



## André Uhres (28. Mrz 2009)

Alloc hat gesagt.:


> Was mir noch nicht so ganz klar ist, ist wo was gemacht wird (vor allem, da da Beispielcode vermischt ist mit dem Code der Komponenten). Außerdem sieht das für mich so aus, als ob die erste Spalte eine feste Breite hat (durchgehend durch alle Zeilen, im Beispielprog die Spalte mit "Welt", "Europa", etc). Ich will ja, dass genau dies nicht der Fall ist, da eben speziell diese erste Spalte sehr umfangreich werden wird in der ersten Baumebene


Chris, das war so gedacht, daß in der ersten Spalte (JTree) die Kurzbezeichnung steht und in der zweiten Spalte die vollständige Bezeichnung. Die erste Spalte gehört zwar nicht zur JTable, aber man kann sie trotzdem in der Breite verändern, indem man den Divider vom Splitpane verschiebt.

Man kann sicherlich noch einiges verbessern, aber ich denke, der Code ist ziemlich übersichtlich gegliedert, und die Methodennamen (sowie andere Namen) sind meisten selbsterklärend. Hier einige zusätzliche Bemerkungen:

"Table" ordnet die Renderer den entsprechenden Datentypen zu. Man kann weitere Render vorsehen,
wenn man will. Dort ist auch die Methode "shouldCombineCells", die wir gegebenenfalls anpassen
müssen. Sie wird in getCellRect auffgerufen, wo das eigentliche Verbinden der Zellen stattfindet.

"TableAdapter" enthält die Spaltenüberschriften der JTable.

"TableNode" enthält die Daten für die JTable (dataRow), sowie die Kurzbezeichnung, die im JTree erscheint (label).

"TreeTablePanel"  verbindet alles zu einer Einheit (naja, der JButton "btAdd" gehört da vielleicht nicht
rein). Dort muss man eigentlich nichts mehr anpassen (ausser vielleicht Sachen wie die RowHeight in der Methode "customizeTable").


----------



## Alloc (28. Mrz 2009)

Hi, 



André Uhres hat gesagt.:


> Man kann sicherlich noch einiges verbessern, aber ich denke, der Code ist ziemlich übersichtlich gegliedert, und die Methodennamen (sowie andere Namen) sind meisten selbsterklärend.


Meine Anmerkungen sollten nicht irgendwie negativ klingen oder so, bis jetzt sieht das ganze nur einfach nicht soooo ideal für meine Zwecke aus 
Im Idealfall hätte ich halt lieber eine "normale" TreeTable (also, beides in einem, wie bei JXTreeTable oder die Kompo von OpenSwing). So müsste ich zb die erste Spalte leer lassen, also nur zur Baumsteuerung verwenden, und könnte erst in der zweiten mit Inhalt anfangen.

Was mir noch aufgefallen ist: Wenn man in der Table im Beispiel die Spalten vertauscht wird der Inhalt falsch angezeigt (wahrscheinlich wird der falsche Renderer für die Inhalte ausgewählt).



André Uhres hat gesagt.:


> "TableNode" enthält die Daten für die JTable (dataRow), sowie die Kurzbezeichnung, die im JTree erscheint (label).


Seh ich das richtig, dass an der Stelle zur Zeit fest vorgegeben ist, dass die rechte Seite nur 2 Spalten haben kann?



André Uhres hat gesagt.:


> "TreeTablePanel"  verbindet alles zu einer Einheit (naja, der JButton "btAdd" gehört da vielleicht nicht rein). Dort muss man eigentlich nichts mehr anpassen (ausser vielleicht Sachen wie die RowHeight in der Methode "customizeTable").


Was macht denn dieses TreeTablePanel-Array in der TreeTablePanel-Klasse? Außerdem fehlen doch dort im Prinzip die Schnittstellen um von außerhalb (also, wenn ich dieses TreeTablePanel als Komponente in meiner GUI habe) auf die Daten zuzugreifen (zB welcher Datensatz gewählt ist) etc?

Grüße,
Chris


----------



## André Uhres (29. Mrz 2009)

Chris, das Problem beim Spaltenvertauschen liegt wahrscheinlich daran, daß keine Konversion der Spaltennummer gemacht wurde (convertColumnIndexToModel) bzw. nicht direkt auf das TableModel zugegriffen wurde. Das müsste sich leicht beheben lassen.
Die "TreeTable" ist übrigens kein fertiges Endprodukt mit allen möglichen Ansprüchen, sondern nur ein Codeschnippsel als Ansatz für Entwickler. Fühl dich frei, so viele Spalten und Zugriffsmethoden hinzuzufügen, wie du brauchst.
Das TreeTablePanel-Array in der TreeTablePanel-Klasse ist nicht unbedingt nötig. Ich habe es hinzugefügt, für den Fall wo mehrere identische TreeTables angezeigt werden sollen (das war mal eine Forumfrage).


----------

