helmito Geschrieben 27. Oktober 2003 Geschrieben 27. Oktober 2003 Hallo, ich bin momentan dabei ein Programm zu schreiben, welches aus einer Datenbank liest und den Inhalt dann in ein JTable-Objekt darstellt. Das Lesen und Anzeigen der Daten ist kein Problem. Mein Problem ist, dass der Inhalt der Tabelle "ausgewertet" werden soll. D.H., dass die Zellen, die beispielsweise den Inhalt "C" haben die Hintergrundfarbe "grün" haben soll, während z.B. die Felder mit den Inhalt "E" die Hintergrundfarbe "rot"haben soll. Ein weiteres Problem, was ich habe ist, dass die Spalten ser Tabelle am Anfang immer dieselbe Größe haben. Zwar kann man die Größen im nachhinein ändern, nur ist das nicht was ich möchte. Kann mir jemand sagen, wie man es hinbekommt, dass die Spaltenbreite vom Spalten-Inhalt variiert (optimale Grösse), jedoch soll hinterher immer noch möglich sein, die Spaltengrößen manuell zu verändern. Hier habt Ihr zum besseren Verständnis mal meinen Quellcode: import javax.swing.JTable; import java.util.Vector; import java.awt.Color; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.JScrollPane; import java.awt.GridLayout; import javax.swing.JPanel; public class Table { private JTable table = null; private DefaultTableModel d; private TableCellRenderer cellR; private Color notSelected; private Color selected; private JScrollPane scroll = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, // This initialized a JScroll-object JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); private int row_q = 0; private int column_q = 0; public Table(Vector rowData, Vector columnNames) { table = new JTable(rowData, columnNames); d = new DefaultTableModel(rowData, columnNames); this.init(); } public void init() { table.setModel(d); table.setAutoResizeMode(table.AUTO_RESIZE_OFF); row_q = table.getRowCount(); column_q = table.getColumnCount(); notSelected = table.getGridColor(); scroll.setViewportView(table); } public void check_table() { String buffer; for(int i = 0; i < column_q; i++) { for(int run = 0; run < row_q; run++) { buffer = (String) d.getValueAt(run, i); if (buffer.equals("C") == true) { } else if (buffer.equals("C") == true); } } } public JScrollPane get_table() { check_table(); return scroll; } Danke für eure Hilfe, HELMITO Zitieren
Peregrin Geschrieben 27. Oktober 2003 Geschrieben 27. Oktober 2003 hi, dafür gibt es den TableCellRenderer. Diesen in einer eigenen klasse implementieren und die Methode "getTableCellRendererComponent" so überschreiben, dass die gewünschte JComponent (mit Hintergrundfarbe) zurückgegeben wird. diesen TableCellRenderer einfach mit der Methode setDefaultRenderer(Class, TableCellRenderer) einer JTable hinzufügen und schon erstahlen alle Zellen mit dem inhalt "c" in herrlichem rot / grün / gelb bei weiteren Fragen einfach posten. hth [edit] hilfreich auch der java-almanach [/edit] Zitieren
helmito Geschrieben 28. Oktober 2003 Autor Geschrieben 28. Oktober 2003 Hi, Danke für die Information. Ich hab jetzt die Klasse soweit geändert: // This renderer extends a component. It is used each time a // cell must be displayed. public class MyTableCellRenderer extends JLabel implements TableCellRenderer { // This method is called each time a cell in a column // using this renderer needs to be rendered. public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int r, int c) { Object contentCell = table.getValueAt(r,c); if (contentCell.equals("COMPLETED") == true) { this.setBackground(new Color(0,255,0)); this.setForeground(new Color(0,255,0)); } else if (contentCell.equals("ERROR") == true) { this.setBackground(new Color(0,0,255)); this.setForeground(new Color(255,0,0)); } else if (contentCell.equals("GEHEN") == true) { this.setBackground(new Color(0,0,255)); this.setForeground(new Color(255,255,0)); } this.setText(value.toString()); return this; } } Code Auszüge bitte auf das relevante kürzen und in [ code][ /code] Tags (ohne Leerzeichen) einschließen. Gruß Jaraz Zwar ändert die neu implementierte Klasse die Vordergrund-Farbe nur kann man seltsamer weise die Hintergrund-Farbe nicht ändern. Kann mir vielleicht einer sagen, wieso??? Zitieren
Peregrin Geschrieben 28. Oktober 2003 Geschrieben 28. Oktober 2003 hi, Original geschrieben von helmito [...] Zwar ändert die neu implementierte Klasse die Vordergrund-Farbe nur kann man seltsamer weise die Hintergrund-Farbe nicht ändern. Kann mir vielleicht einer sagen, wieso??? dein TableCellRenderer ist ein JLabel. ein JLabel ist per default durchsichtig. du musst label.setOpaque(true); aufrufen, damit die hintergrundfarbe auch zu sehen ist. hth Zitieren
helmito Geschrieben 28. Oktober 2003 Autor Geschrieben 28. Oktober 2003 Hat geklappt, DANKE!!! Durch die Änderungen ist nur die Fähigkeit sich mithilfe der Pfeiltasten durch die Tabelle navigieren zu können offenbar mit überschrieben worden. Vor den Änderungen konnte man auf eine Zeile der Tabelle klicken, so dass sich dann diese Zeile graphisch von den anderen Zeilen hervorgehoben hat (hatte eine andere Farbe, wobei die Zelle, die den Fokus hat weiß war mit einen farbigen Rand). Man konnte dann mit Hilfe der Pfeiltasten sich durch die Tabellen navigieren. Wie krieg ich diese Fähigkeit den wieder hin??? Zitieren
helmito Geschrieben 28. Oktober 2003 Autor Geschrieben 28. Oktober 2003 Hallo noch mal !!!! Weiss den einer von Euch, wie man beim Programmstart eine dynamische Spaltenbreite hinbekommt, jedoch der Anwender diese Breite auch manuel ändern können. Gruesse, helmito 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.