ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
1192
1192
EMPFEHLEN
-
Hallo zusammen,
ich arbeite an einem JTable, welche zwei Spalten mit Hilfe eines Renderers vergleicht und die Werte einer der beiden Spalten entsprechend einfärbt.
Nun habe ich den Sortieralgorithmus von Sun eingebunden und nach dem Sortieren stimmt die Färbung der Zellen nicht mehr. Zum Sortieren hab ich die Methode getColumnClass() vom DefaultTableModel überschrieben, damit Zahlen auch als solche erkannt und sortiert werden.
Interessant finde ich, dass ein anderer Renderer mit dem Sortieren keinerlei Probleme hat. Dieser Renderer führt aber auch keinen Vergleich zwischen zwei Spalten durch, sondern färbt nur negative Zahlen rot ein.
Hat jemand eine Idee, was ich wo und wie manipulieren muss, damit der Vergleich auch nach dem Sortieren wieder funktioniert? Wie gesagt, bevor ich sortiere, ist die Anzeige korrekt.
Danke schonmal
Katrin
-
Ohne Quellcode sind Tipps schwierig.
Zitat von stookie
Ich persönlich empfehle prinzipiell das Arbeiten mit TableRows. Ich sollte wohl mal ein kleines Tutorial dazu verfassen...Zum Sortieren hab ich die Methode getColumnClass() vom DefaultTableModel überschrieben, damit Zahlen auch als solche erkannt und sortiert werden.
Sollte normalerweise keinen Unterschied machen, aber ohne Code...Interessant finde ich, dass ein anderer Renderer mit dem Sortieren keinerlei Probleme hat. Dieser Renderer führt aber auch keinen Vergleich zwischen zwei Spalten durch, sondern färbt nur negative Zahlen rot ein.
Naja, je nachdem wie, was und wann Du sortierst.Hat jemand eine Idee, was ich wo und wie manipulieren muss, damit der Vergleich auch nach dem Sortieren wieder funktioniert? Wie gesagt, bevor ich sortiere, ist die Anzeige korrekt.
Danke schonmal
Katrin
-
Hallo nochmal,
ok, hab das Programm mal soweit gestutzt, dass ich den Quellcode posten kann.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.border.*; public class Sortieren extends JFrame { JScrollPane scrollPane = new JScrollPane(); DefaultTableModel tableModel; public static void main(String args[]) { new Sortieren().show(); } public Sortieren() { super("Test-GUI"); setSize(500,110); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); tableModel = new DefaultTableModel() { public Class getColumnClass(int columnIndex) { switch (columnIndex) { case 0: return Float.class; case 1: return Float.class; case 2: return Integer.class; default: return null; } } }; TableSorter sorter = new TableSorter(tableModel); JTable table = new JTable(sorter); sorter.setTableHeader(table.getTableHeader()); table.getTableHeader().setReorderingAllowed(false); tableModel.addColumn("Wert"); tableModel.addColumn("Referenz"); tableModel.addColumn("unwichtig"); Vector zeile1 = new Vector(); zeile1.add(new Float(0.911)); zeile1.add(new Float(0.947)); zeile1.add(new Integer(56)); Vector zeile2 = new Vector(); zeile2.add(new Float(0.824)); zeile2.add(new Float(1.010)); zeile2.add(new Integer(77)); Vector zeile3 = new Vector(); zeile3.add(new Float(0.902)); zeile3.add(new Float(0.852)); zeile3.add(new Integer(7)); Vector zeile4 = new Vector(); zeile4.add(new Float(1.155)); zeile4.add(new Float(1.273)); zeile4.add(new Integer(188)); tableModel.addRow(zeile1); tableModel.addRow(zeile2); tableModel.addRow(zeile3); tableModel.addRow(zeile4); table.getTableHeader().setReorderingAllowed(false); table.setEnabled(false); scrollPane.setViewportView(table); getContentPane().add(scrollPane, BorderLayout.CENTER); table.getColumnModel().getColumn(1).setCellRenderer(new VergleichRenderer()); } public class VergleichRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component renderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); ((JLabel)renderer).setOpaque(true); float ref = ((Float)value).floatValue(); float wert = ((Float)tableModel.getValueAt(row,column-1)).floatValue(); if (ref > wert) setBackground (Color.green); else setBackground (Color.yellow); return renderer; } } private void exitForm(java.awt.event.WindowEvent evt) { System.exit(0); } }
Ich hoffe mal, dass der Sortieralgo von Sun bekannt ist, ansonsten poste ich den Code auf Anfrage.
In dieser (kleineren) Tabelle wird falsch gerendert, wenn ich die erste Spalte per Klick auf den Spaltenkopf sortiere. Dies ist auch die Spalte, mit der im Renderer verglichen wird. Allerdings ist anzumerken, dass ich vorher noch zwei Spalten mit Strings in der Tabelle stehen hatte und beim Sortieren nach diesen Spalten wurde auch falsch gerendert.
Falls sich jemand das Problem erklären kann wäre ich dankbar, wenn derjenige es auch mir erklärt.
Bis dann
Katrin
-
02.12.04 21:38 #4
Hallo Katrin,
Dein Problem liegt einfach daran, dass Du im Renderer das "Original"-TableModel benutzt und nicht das "Sorted"-TableModel.
Ich versuche das zu erklären. Die Klasse TableSorter ist nur ein Vermittler zwischen JTable und ihrem TableModel. Das heißt, es delegiert alle Events von der JTable an das TableModel und im Gegenzug holt die Daten von dem TableModel, sortiert sie und liefert dann an die JTable in sortierter Form. Daraus folgt, dass das eigentliche TableModel die Daten in unsortierter form vorliegen hat. Daher, wenn Du im Renderer versuchst, den Wert aus der ersten Spalte zu holen, bekommst Du ihn höchstwahrscheinlich aus einer falschen Zeile.
Die Lösung ist sehr einfach: ersetze diese Zeile:
...durch die hier:Code :1
float wert = ((Float)tableModel.getValueAt(row,column-1)).floatValue();
GrußCode :1
float wert = ((Float)table.getValueAt(row,column-1)).floatValue();
Vincent
-
Guten Morgen Vincent,
Danke, dass Du mir das Brett vom Kopf genommen hast, alles klappt wunderbar.
Gruß
Katrin
Ähnliche Themen
-
Renderer für TableHeader einer JTable mit mehreren Tabellenmodellen
Von Copia im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 09.09.10, 09:56 -
JTable => Renderer
Von MariusMeier im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 6Letzter Beitrag: 14.11.08, 12:44 -
JTable mit eigenem Renderer: wie entsprechende Zeilenhöhen setzen?
Von DarthShader im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 18.08.08, 17:53 -
JTable Header mit eigenem Renderer - Rahmen weg...
Von Florian Strienz im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 2Letzter Beitrag: 08.04.08, 10:50 -
komplexes JTable Renderer Problem
Von McSnoop im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 11Letzter Beitrag: 11.02.05, 17:32





Zitieren
Login





