Saban Geschrieben 15. März 2009 Geschrieben 15. März 2009 Hallo Zusammen! ich habe eine JTable in der ich alle Spalten bis auf die letzten 2 gesperrt habe. Nun möchte ich meine CellRenderer Klasse so umschreiben das alle Zellen die nen String haben der länger ist wie 20 Zeichen umbrechen und die Zeilenhöhe (nur in der Zeile wo es zu trifft) ändert. Zu versuchs zwecken habe ich nun mal meinen CellRenderer folgendermaßen erweitert public class Cell_Renderer extends JLabel implements TableCellRenderer{ private Color LIGHTGREY = new Color(220, 220, 220); private Color GREY = new Color(181, 181, 181); private Font ZELLEN_FONT = new Font("Arial", Font.BOLD, 12); private Border ZELLEN_BORDER = BorderFactory.createEmptyBorder(1, 1, 1, 1); public Cell_Renderer(){ setOpaque(true); setBorder(ZELLEN_BORDER); } public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column){ if(value != null){ setText(value.toString()); } else { setText(""); } setFont(tabelle.getFont()); setForeground(tabelle.getForeground()); setBackground(tabelle.getBackground()); if(isSelected){ setFont(ZELLEN_FONT); } //Angezeigte Spalte in Modellspalte umwandeln column = tabelle.convertColumnIndexToModel(column); if(isSelected){ setBackground(GREY); } else if(column == 8 || column == 9){ setBackground(LIGHTGREY); } // Hier ist der Code für den Zeilenumbruch String text = getText(); String teil1 = ""; String teil2 = ""; if(text.length() > 10){ teil1 = text.substring(0, 5); teil2 = text.substring(6, text.length()); } setText("<HTML>" + teil1 + "<BR>" + teil2 + "</HTML>"); return this; } } Mein Problem ist nun das nur noch Zellen angezeigt werden die nen String haben der länger ist wie 10 Zeichen und die Zeilenhöhe wird auch nicht angepasst. Könnt ihr mir sagen was ich falsch mache :confused: MfG Saban Zitieren
VaNaTiC Geschrieben 16. März 2009 Geschrieben 16. März 2009 Ich denke schon, dass ich das Problem erkannt habe: // Hier ist der Code für den Zeilenumbruch String text = getText(); String teil1 = ""; String teil2 = ""; if(text.length() > 10){ teil1 = text.substring(0, 5); teil2 = text.substring(6, text.length()); [COLOR="#ff0000"]setText("<HTML>" + teil1 + "<BR>" + teil2 + "</HTML>");[/COLOR] } [COLOR="Red"]//setText("<HTML>" + teil1 + "<BR>" + teil2 + "</HTML>");[/COLOR] return this; } Wenn Du außerhalb der IF-Sequenz mittels setText( teil1 ... teil2 ) den Text immer setzt, dann ist teil1 und teil2 genau immer dann leer, wenn Du halt vorher nicht in die IF-Sequenz reingehst! Zitieren
Saban Geschrieben 16. März 2009 Autor Geschrieben 16. März 2009 Hey Vanatic! Danke für deinen Tip war genau der Fehler! :) Hast du mir vllt auch gleich einen wie ich die Zeilenhöhe der zutreffenden Zeilen ändern kann? MfG Saban Zitieren
VaNaTiC Geschrieben 17. März 2009 Geschrieben 17. März 2009 (bearbeitet) Hast du mir vllt auch gleich einen wie ich die Zeilenhöhe der zutreffenden Zeilen ändern kann? JTable.setRowHeight(int,int) (Java 2 Platform SE v1.4.2) Jetzt musst Du nur noch dafür sorgen, dass Du innerhalb Deines TableCellRenderers eine Referenz auf die JTable herbekommst, so dass Du die Methode ausführen kannst. Eventuell musst Du danach noch ein JTable.update() oder so machen. Bearbeitet 17. März 2009 von VaNaTiC URL-Tag wurde falsch eingetragen Zitieren
Saban Geschrieben 17. März 2009 Autor Geschrieben 17. März 2009 Hi wie bekomme ich bitte so ne Referenz auf die JTable :confused: MfG Saban Zitieren
VaNaTiC Geschrieben 17. März 2009 Geschrieben 17. März 2009 wie bekomme ich bitte so ne Referenz auf die JTable Hmm, schäm Dich! Mir scheint Du kennst Deinen Quellcode nicht besonders Guckst Du hier: public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column) Zitieren
Saban Geschrieben 17. März 2009 Autor Geschrieben 17. März 2009 *SCHÄM* ja sags halt gleich Danke dir echt! du hast mir schon so oft geholfen! bist einfach Spitze Eine Frage hätt ich aber noch und zwar will ich ja nur die Zeilenhöhe der Zeilen vergrößern bei denen auch die Zeile umgebrochen wird. Wenn ich aber sage if(text.length() > 10){ teil1 = text.substring(0, 5); teil2 = text.substring(6, text.length()); setText("<HTML>" + teil1 + "<BR>" + teil2 + "</HTML>"); tabelle.setRowHeight(20); } dann macht der des bei allen. Was ja auch klar ist weil ich ja die Tabelle hernehme und nicht die Zeile... Kann man das auch auf eine bestimmte Zeile beziehen? MfG Saban Zitieren
VaNaTiC Geschrieben 17. März 2009 Geschrieben 17. März 2009 tabelle.setRowHeight(20); dann macht der des bei allen. Ja, stimmt, denn das sagst Du auch explizit mit JTable.setRowHeight(int). Was ja auch klar ist weil ich ja die Tabelle hernehme und nicht die Zeile... Ja, genau Du nutzt einfach die falsche setRowHeight(...) Kann man das auch auf eine bestimmte Zeile beziehen? Natürlich. Und das hab ich bereits gepostet mit dem Link aus dem JAVA-Doc-API. JTable.setRowHeight(int pixel) <--- global für alle Zeilen in Tabelle != JTable.setRowHeight(int row, int pixel) <--- nur für die eine Zeile !!! Zitieren
Saban Geschrieben 17. März 2009 Autor Geschrieben 17. März 2009 Des wird ja immer peinlicher... (lesen sollte man schon können...) ja gut das Problem bleibt aber irgendwie bestehen tabelle.setRowHeight(row, 40); ich hab jetzt einfach mal die Row hergenommen weil ich sonst keine Ahnung habe wie ich mich auf die aktuelle Zeile beziehen kann und des wirkt sich dann wieder auf alle Zeilen auf... (hoffe liegt nicht wieder daran das ichs nicht richtig gelesen habe...) MfG Saban Zitieren
VaNaTiC Geschrieben 17. März 2009 Geschrieben 17. März 2009 Ich brauch mehr Quellcode. Nicht das es außerhalb einer IF ist! Zitieren
Saban Geschrieben 17. März 2009 Autor Geschrieben 17. März 2009 Sorry! Hier: public class Cell_Renderer extends JLabel implements TableCellRenderer{ private Color LIGHTGREY = new Color(220, 220, 220); private Color GREY = new Color(181, 181, 181); private Font ZELLEN_FONT = new Font("Arial", Font.BOLD, 12); private Border ZELLEN_BORDER = BorderFactory.createEmptyBorder(1, 1, 1, 1); public Cell_Renderer(){ setOpaque(true); setBorder(ZELLEN_BORDER); } public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column){ if(value != null){ setText(value.toString()); } else { setText(""); } setFont(tabelle.getFont()); setForeground(tabelle.getForeground()); setBackground(tabelle.getBackground()); if(isSelected){ setFont(ZELLEN_FONT); } //Angezeigte Spalte in Modellspalte umwandeln column = tabelle.convertColumnIndexToModel(column); if(isSelected){ setBackground(GREY); } else if(column == 8 || column == 9){ setBackground(LIGHTGREY); } String text = getText(); String teil1 = ""; String teil2 = ""; if(text.length() > 10){ teil1 = text.substring(0, 5); teil2 = text.substring(6, text.length()); setText("<HTML>" + teil1 + "<BR>" + teil2 + "</HTML>"); tabelle.setRowHeight(row, 40); } return this; } } MfG Saban Zitieren
VaNaTiC Geschrieben 17. März 2009 Geschrieben 17. März 2009 Hmm, passt alles. Keine Ahnung, was bei Dir falsch läuft. Hab mir spasseshalber mal nen BeispielFrame gemacht: final DefaultTableModel data = new DefaultTableModel(100,1); final JTable table = new JTable(data); table.setDefaultRenderer(Object.class, new Cell_Renderer()); JScrollPane scroller = new JScrollPane(table); table.setFillsViewportHeight(true); JPanel buttons = new JPanel(); JButton test = new JButton("Test"); test.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < data.getRowCount(); i++) { sb.append('0'+i); data.setValueAt(sb.toString(), i,0); } table.updateUI(); } }); buttons.setLayout(new FlowLayout()); buttons.add(test); getContentPane().setLayout(new BorderLayout()); getContentPane().add(buttons, BorderLayout.NORTH); getContentPane().add(scroller, BorderLayout.CENTER); Und mit Deinem Cell_Renderer funktioniert das prima?! Zitieren
Saban Geschrieben 17. März 2009 Autor Geschrieben 17. März 2009 Hmm Komisch :confused: Muss ich mal schauen ob ich bei der JTable nen Fehler gemacht hab oder irgendwas ausversehen geändert hab aber das find ich schon noch raus Auf alle Fälle möchte ich mich nochmal bei dir bedanken du hast mir extrem geholfen ohne dich würde ich wahrscheinlich wochen für die ganzen Probleme brauchen... VIELEN DANK Ich hoffe ich kann mich irgendwann mal revanchieren falls du mal nicht weiter kommst MfG Saban Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.