Woher bekommt ein TableCellEditor sein value?
-
hallo leute,
ich möchte ein JTable so editierbar machen, daß in jeder der zellen die schriftart, -farbe, -grösse veränderbar ist (von buchstabe zu buchstabe) und mehrere zeilen in einer zelle problemlos eingefügt werden können.
mein lösungsansatz dazu ist es, einen eigenen TableCellEditor und TableCellRenderer zu schreiben, die beide von JTextArea erben und sich dann als EditorComponent bzw. RendererComponent zurückgeben. als value hätte ich mir gedacht, anstatt eines Strings, das basierende dokument zwischen den beiden hin und her zu schieben. von seiten des editor habe ich dabei kein problem, denn er erhält das dokument via
public Component getTableCellEditorComponent(JTable table, [b]Object value[/b], boolean isSelected, int row, int column)
und gibt es wieder ab über die methode
public [b]Object[/b] getCellEditorValue()
auf seiten des renderer gibt es aber keine methode, die dieses value wieder ausliest und an den editor weiterreicht. was ich bräuchte wäre im renderer das pondon zur letzten methode, also etwas wie getCellRendererValue(). wie gibt der Renderer das value an den Editor?
ich bin für alle vorschläge offen. wenn ihr einen besseren vorschlag habt, um meinem table die gewünschten eigenschaften zu verleihen würde ich den auch gerne mal lesen.
habt vielen dank
bernd
-
hallo leute,
ich hab es mittlerweile geschaft das problem selbst zu lösen. meine sichtweise eines jtables bzw. dessen editor und renderer war nicht ganz korrekt. die lösung des problems ist folgende:
1. eigenes TableModel erzeugen, das sich vorinitialisiert mit einem 2D-Array, bestehend aus (in meinem fall) instanzen von SimpleStyledDocument. die verwaltung dieses arrays bleibt dem entwickler überlassen. im original (DefaultTableModel) ist es ein Vector, ich habe ArrayList verwendet. die methode getColumnClass() muss ebenfalls überschrieben werden, dahingehend, daß sie egal welche spalte als parameter in die methode kommt, immer SimpleStyledDocuments.class zurückgibt.
2. man schreibe einen eigenen TableCellRenderer der aus der methode getTableCellRendererComponent eine neue JTextArea zurückgibt. deren document wird als value in die methode übergeben. was noch folgen sollte ist ein setEditable(false) auf die textarea, da wir hier ja den renderer haben, der den text nur anzeigen soll.
3. es ist ein TableCellEditor zu schreiben, der aus der methode getTableCellEditorComponent ebenfalls eine neue JTextArea zurückgibt. deren document ist ebenfalls das dort zu erhaltende value. diese textarea solle man in einer globalen variablen zwischenspeichern, da sie in der methode getCellEditorValue() nochmals gebraucht wird (dort gibt man dann textarea.getDocument() zurück). die restlichen methoden des editors sind nach eigenem ermessen auszufüllen.
4. instanzierung des jtable:
JTable jtable = new JTable(new MyTableModel(numRows,numColumns) ); jtable.setDefaultEditor( DefaultStyledDocument.class, new myTableCellEditor() ); jtable.setDefaultRenderer( DefaultStyledDocument.class, new myTableCellRenderer() );
mit den letzten beiden zeilen wird das table angewiesen, beim vorliegen eines DefaultStyledDocument als value unseren eigenen renderer bzw. editor zu verwenden.
ich hoffe ich kann damit ein paar leuten helfen, die ein ähnliches problem haben.
viel glück
bernd
-
sorry leute, hab mich grad vertan ... ich meine natürlich DefaultStyledDocument anstatt SimpleStyledDocument. das kommt davon, wenn man nebenher noch mit anderen klassen wie dem SimpleAttributeSet herumhantiert.
ciao
bernd
-
Ich muß meinen Beitrag nochmals verbessern. Eine JTextArea wird meinen Anforderungen nicht gerecht, da Sie den gesammten Text in einer einzigen Schriftart präsentiert. Das JTextPane erfüllt hingegen diesen Zweck.
grüsse
bernd