Zellen in JTable unterschiedlich einfärben - Renderer funktioniert nicht

Rabenherz

Mitglied
Moin


Ich weis das Problem wurde hier schon sehr oft diskutiert aber trotzdem hab ich beim suchen keine Lösung für mein Problem gefunden.

Also: Ich will Zellen einer Tabelle einzel einfärben (weis, grau, rot oder blau). Ich hab mir also einen ColoredTableCellRenderer als Vererbung des DefaultTableCellRenderer gebaut...der sieht folgendermaßen aus:

Code:
package gui;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class ColoredTableCellRenderer extends DefaultTableCellRenderer {
	//----------------------------------------------
	//### 			Attributes					 ###
	//----------------------------------------------
	protected String[] cellColor = new String[16];
			
	//----------------------------------------------
	//### 			Constructors				 ###
	//----------------------------------------------	
			
		//-----------------------------
		//getTableCellRendererComponent
		//-----------------------------
		public ColoredTableCellRenderer() {
			for (int i = 1; i<16; i++){
				cellColor[i] = "gray";
			}
		}
			
			
	//----------------------------------------------
	//### 			Methods						 ###
	//----------------------------------------------
	
		//-----------------------------
		//getTableCellRendererComponent
		//-----------------------------
		@Override
		public Component getTableCellRendererComponent(
		   		JTable table, 
		   		Object value, 
		   		boolean isSelected, 
		   		boolean hasFocus, 
		   		int row, 
		   		int column) {
			String cellContent = (String)	value;
			JLabel label = new JLabel(cellContent);
			String thisCellColor = cellColor[row];
			
			if (thisCellColor.equals("white")){
				label.setBackground(Color.WHITE);
			} else {
			if (thisCellColor.equals("gray")){
				label.setBackground(Color.LIGHT_GRAY);
			} else {
			if (thisCellColor.equals("red")){
				label.setBackground(Color.RED);
			} else {
			if (thisCellColor.equals("blue")){
			label.setBackground(Color.BLUE);
			} else {
				label.setBackground(Color.GRAY);
			}}}}	
			
			return label;
		    }//getTableCellRendererComponent

}//ColoredTableCellRenderer


Der wird auch der bettrefenden Spalte passen zugefügt:

Code:
[...]

private DefaultTableModel				dtm;
priavat JTable                                    register;
private ColoredTableCellRenderer		cellRenderer;

[...]

dtm = new DefaultTableModel(rowData,new String[2]){
		public boolean isCellEditable(int rowIndex, int columnIndex){
			return false;
		}
	};

register = new JTable(dtm);	

cellRenderer = new ColoredTableCellRenderer();

register.getColumnModel().getColumn(1).setCellRenderer(cellRenderer);

Allerdings sind die Zellen selbst beim aufrufen der Gui alle weis...obwohl (Debugmode getestet) beim aufruf von getTableCellRendererComponent grau als Farbe korrekt gesetzt wird.

Hat irgendjemand ne Idee wo der Fehler liegt, bzw. brauch noch mehr Infos?
Bin leider mit JTables noch nicht wirklich versiert.

Danke schonmal im Vorraus
 
Hallo,


man sollte nicht unbedingt immer ein neues Object in der getTableCellRendererCompontent anlegen.

Code:
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class ColoredTableCellRenderer
    extends DefaultTableCellRenderer
{
  // ----------------------------------------------
  // ### Attributes ###
  // ----------------------------------------------
  protected String[] cellColor = new String[16];

  // ----------------------------------------------
  // ### Constructors ###
  // ----------------------------------------------

  // -----------------------------
  // getTableCellRendererComponent
  // -----------------------------
  public ColoredTableCellRenderer()
  {
    for (int i = 0; i < 16; i++)
    {
      cellColor[i] = "gray";
    }
  }

  // ----------------------------------------------
  // ### Methods ###
  // ----------------------------------------------

  // -----------------------------
  // getTableCellRendererComponent
  // -----------------------------
  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    String thisCellColor = cellColor[row];

    if (thisCellColor.equals("white"))
    {
      label.setBackground(Color.WHITE);
    }
    else
    {
      if (thisCellColor.equals("gray"))
      {
        label.setBackground(Color.LIGHT_GRAY);
      }
      else
      {
        if (thisCellColor.equals("red"))
        {
          label.setBackground(Color.RED);
        }
        else
        {
          if (thisCellColor.equals("blue"))
          {
            label.setBackground(Color.BLUE);
          }
          else
          {
            label.setBackground(Color.GRAY);
          }
        }
      }
    }

    return label;
  }// getTableCellRendererComponent

}// ColoredTableCellRenderer

MFG

Sascha
 
Danke, jetzt ist immerhin die Tabelle zu Beginn des Programms richtig eingefärbt. Allerdings wird im Laufe der Anwendung der Inhalt der Tabelle mehrfach überschrieben mit setDataVector....und ab diesem Zeitpunkt sind wieder alle Zellen weis.....muss ich da evetl. noch eine Methode überschreiben?
 
Ich hab das problem gefunden. Durch setzen des neuen Vectors wurde in der entsprechenden Spalte (die einfärbung soll ja nur in einer Spalte stattfinden) der Renderer durch den DefaultTableCellRenderer überschrieben...ich hab mir einfach ne Funktion gemacht in der ich den dann neu setze:

Code:
public void changeTableData(){
			rowData = createRowData();
			registerModel.setDataVector(rowData,new String[2]);
			register.getColumnModel().getColumn(1).setCellRenderer(cellRenderer);
		}
 
Zurück