# JTable mit TableCellRenderer



## Rainbow (6. Mrz 2009)

Hi,
ich hab mir ne JTable gemacht mit 3 Spalten und 5 Zeilen.
Nun möchte ich jede Zelle individuell bearbeiten können. Dafür benutze ich einen TableCellRenderer.
Jetzt möchte ich zum Beispiel in einer Zelle den Text ändern, aber mit setValueAt funktioniert das nicht.
Wie kann man das machen?

[HIGHLIGHT="Java"]public class SampleTableCellRenderer extends JLabel implements TableCellRenderer {

	DefaultTableCellRenderer tableRenderer = new DefaultTableCellRenderer();

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		table.setValueAt("Hallo", 0, 0);
		table.setOpaque(true);
		tableRenderer = (DefaultTableCellRenderer)tableRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

		return tableRenderer;
	}
}[/HIGHLIGHT]

Gruss
Rainbow


----------



## Illuvatar (6. Mrz 2009)

Schau mal in die FAQ: Java FAQ » JTable

Edit: Das Forum macht den Link kaputt :/
Edit Ebenius: Hab den Link editiert und die Fehlerbeschreibung weitergeleitet.


----------



## Rainbow (6. Mrz 2009)

gibt es denn nicht irgendeinen Aurfruf wie...

getCell(row, column).setText("Test");
gettCell(row, column).setBackround(Color.Red);

oder so?
etwas in der Art habe ich dort nicht gefunden


----------



## Ebenius (6. Mrz 2009)

Nö. Das Konzept (allgemein in Swing) ist ganz anders. Die Daten kommen aus dem TableModel, die Spaltenauswahl- und Reihenfolge bestimmt das TableColumnModel, die Zeilen-Selektion und die Spalten-Selektion wird über je ein SelectionModel abgebildet, die Zellendarstellung übernimmt ein TableCellRenderer, das Editieren übernimmt ein TableCellEditor, die Darstelung der Spaltenköpfe (wieder per TableCellRenderer) und die Ansteuerung der Zeilensortierung und der Spaltenreihenfolge übernimmt die JTableHeader-Komponente, die Sortierung der Zeilen in der Darstellung macht ein TableRowSorter und alles wird von der JTable-Komponente gesteuert und zusammen gehalten. Bestimmt habe ich noch irgendwelche Teile vergessen.

Zum Glück ist das so modular aufgebaut, ansonsten würde man sich oft ins Knie schießen. Das bestätigen Dir sicher gern einige Leute die mit .NET das DataGrid verwenden müssen und ständig an die Grenzen des Machbaren stoßen.

Ebenius


----------



## GilbertGrape (6. Mrz 2009)

Ebenius hat gesagt.:


> Das bestätigen Dir sicher gern einige Leute die mit .NET das DataGrid verwenden müssen und ständig an die Grenzen des Machbaren stoßen.
> Ebenius



Ich bestätige hiermit! Das Datagrid is furchtbar!


----------



## Michael... (6. Mrz 2009)

Rainbow hat gesagt.:


> getCell(row, column).setText("Test");


dafür gibt's doch JTable.setValueAt()


Rainbow hat gesagt.:


> gettCell(row, column).setBackround(Color.Red);


das geht nur mittels Renderer

Generell habe ich die Frage noch nicht so ganz verstanden. Was verstehst Du unter eine Zelle individuell zu bearbeiten?


----------



## Rainbow (9. Mrz 2009)

also ich denke ich steige durch das Prinzip selbst noch nicht so ganz durch....
aber wenn ich 2 Spalten und 5 Zeilen hab, dann hab ich ja 10 Zellen....wenn jede einzelne jetzt ne andere Farbe haben soll zum Beispiel...dann brauche ich auch 10 verschiedene CellRenderer oder wie?


----------



## Michael... (9. Mrz 2009)

Rainbow hat gesagt.:


> dann brauche ich auch 10 verschiedene CellRenderer oder wie?


Nein, aufgrund welcher Eigenschaften oder sonstiger Kriterien, soll den die Farbe gesetzt werden?
Man muss im Renderer dann eigentlich nur prüfen welches Kriterium liegt vor und dem entsprechend die Farbe setzen.


----------



## Rainbow (9. Mrz 2009)

ja so genau hab ich mir das noch nicht überlegt.
ich wollte halt nur prinzipiell sachen ausprobieren, um halt irgendwie dahinter zu steigen, wie man mit so einem CellRenderer umgeht


----------



## Michael... (9. Mrz 2009)

Rainbow hat gesagt.:


> ja so genau hab ich mir das noch nicht überlegt


das ist aber meist das Entscheidende ;-)

hier mal ein kurzes Bsp. mit CellRenderer, ansonsten kann man sich mal den Quellcode von DefaultTableCellRenderer anschauen.
[HIGHLIGHT="Java"]import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class ColoredTable extends JFrame{
	private Object[][] data = {
    		{"Zelle A1", "Zelle A2", "Zelle A3", "Zelle A4"},
    		{"Zelle B1", "Zelle B2", "Zelle B3", "Zelle B4"},
    		{"Zelle C1", "Zelle B2", "hurz", "Zelle C4"},
    		{"Zelle D1", "Zelle D2", "Zelle D3", "Zelle D4"}
    }; 
	public ColoredTable() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 500, 300);

		DefaultTableModel model  = new DefaultTableModel();
        model.setDataVector(data, new Object[] {"Spalte A", "Spalte B", "Spalte C", "Spalte D"});
        JTable table = new JTable(model);
		this.getContentPane().add(table, BorderLayout.CENTER);
		table.setDefaultRenderer(Object.class, new ColorRenderer());
		table.setRowHeight(40);
	}

	public static void main(String[] args) {
		new ColoredTable().setVisible(true);
	}

	class ColorRenderer extends JLabel implements TableCellRenderer {
		public ColorRenderer() {
			this.setOpaque(true);
			this.setHorizontalAlignment(JLabel.CENTER);
		}

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
			this.setText(value.toString());

			// Verändern aufgrund der Position
			if ((row%2==0 && col%2==0)|| (row%2==1 && col%2==1))
				this.setBackground(Color.GREEN.darker());
			else
				this.setBackground(Color.CYAN);

			//Verändern aufgrund des Zelleninhalts
			if (value.toString().endsWith("2"))
				this.setForeground(Color.BLUE);
			else
				this.setForeground(Color.RED);
			if (value.toString().equals("hurz"))
				this.setBackground(Color.ORANGE);

			// Verändern aufgrund der Selektion
			if (isSelected)
				this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
			else
				this.setBorder(null);
			return this;
		}
	}
}[/HIGHLIGHT]


----------



## Rainbow (10. Mrz 2009)

danke, das ist aber genau das was ich mir vorgestellt habe.
So meinte ich das 

vielen dank, das Beispiel hilft mir auf jeden Fall weiter


----------

