Verständnisfrage zum CellRenderer

Status
Nicht offen für weitere Antworten.

Kiamur

Aktives Mitglied
Hallo!

Ich habe mal eine kleine Frage zum CellRenderer einer Tabelle: Bekommt eigentlich jede Zelle ihre eigene Instanz des CellRenderers, oder gibt es nur einen CellRenderer für die ganze Tabelle?

Hintergrund: Ich habe eine Tabelle, in der Spalten angewählt werden. Diese werden dann nacheinander in unterschidlichen Farben eingefärb, um die Reihenfolge der Auwahl zu visualisieren. Mein Problem ist, dass zwar die Spalten eingefärbt werden, aber leider immer in der gleichen Farbe.

Wähle ich die erste Spalte an, so wird diese rot. Wähle ich zusätzlich noch eine zweite Spalte an, dann wechselt die Farbe zu grün, aber leider nicht nur für die zweite Spalte, sondern auch in der ersten angewählten Spalte, obwohl diese eigentlich rot sein bleiben sollte. Wähle ich die nächste Spalte an, so wechselt die Farbe wieder zu der aktuellen, aber wieder in allen angewählten Spalten.

Das ist mal der Code dazu: (Problem wohl in den Zeilen 41-52)

Code:
public class MyCellRenderer extends JLabel implements TableCellRenderer
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private Color background = Color.WHITE;
	private boolean hasColor = false;

	public MyCellRenderer()
	{
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
 boolean hasFocus, int row, int column)
	{
		// set the default color for a cell
		setForeground(Color.BLACK);
		setBackground(Color.WHITE);
		
		if(value instanceof String)
		{
			if(value.toString().equals(" "))
			{
				setText(" ");
				return this;
			}				
			
			// determine if the cells value is out of tolerance
			double d = Double.parseDouble(value.toString());
			double t = WorkingSet.getActualTolerance();
			
			if((d > t) || (d < t*-1))
				setForeground(Color.RED);
			
			setText(value.toString());
			
			int[] columns = table.getSelectedColumns();
			
			if(isSelected && (column == columns[table.getSelectedColumnCount()-1]) && !isHasColor())
			{
				background = ChartColorController.getTableColor(table.getSelectedColumnCount());
				setHasColor(true);
			}
			if(!isSelected && (table.getSelectedColumnCount() <= 1) && isHasColor())
			{
				background = Color.WHITE;
				setHasColor(false);
			}
			
			setBackground(background);
		}
		
		return this;
	}

	private boolean isHasColor()
	{
		return hasColor;
	}

	private void setHasColor(boolean hasColor)
	{
		this.hasColor = hasColor;
	}
}

Gruß
Maik
 
es wird ja nicht nur die ausgewählte spalte neugezeichnet sondern auch alle anderen, du musst dir also irgendwo merken die wieviele spalte das ist und welche farbe sie kriegen soll
 
Es gibt pro Spalte einen CellRenderer, aber mehrere Spalten können sich einen CellRenderer auch teilen.

Wie Gast sagte: speicher dir, was rot ist. Das kannst du ja z.B. direkt im TableModel machen.
 
Hallo und danke für die Antworten!

Das hat mich auf eine neue Idee gebracht. Vor allem der Hinweis, dass immer alle Spalten neu gezeichnet werden. . .

Gruß
Maik
 
Hier noch mal ein Nachtrag: Jetzt, wo ich die markierten Spalten im Model abspeichere, funktioniert es tadellos. Für die, die es interessiert hier mal die drei Klasse, die da zusammenarbeiten. ist etwas aus meinem Programmkontext herausgegriffem, aber ich denke man kann sich das Wesentlich herausfiltern.



Code:
public class MyTableModel extends DefaultTableModel
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@SuppressWarnings("unchecked")
	private Vector <Integer>selectedColumns = new Vector();

	public MyTableModel(int size, int i)
	{
		super(size, i);
	}

	// make all cells NOT editable
	public boolean isCellEditable(int rowIndex, int ColumnIndex)
	{
		return false;
	}
	
	// Theese methods are used for the CellRenderer to determine the cells colors
	public void addSelectedColumn(int column)
	{
		Integer col = new Integer(column);
		selectedColumns.add(col);
	}
	
	public void clearSelectedColums()
	{
		selectedColumns.clear();
	}
	
	public Color getCellColor(int column)
	{
		for(int i = 1; i <= selectedColumns.size(); i++)
		{
			if(column == selectedColumns.get(i-1).intValue())
				return ChartColorController.getTableColor(i);
		}
		return Color.WHITE;
	}
}

Code:
public class MyTableMouseListener implements MouseListener
{
	@SuppressWarnings("unchecked")
	
	boolean mousePressed = false;
	
	public void mouseClicked(MouseEvent e)
	{
		// TODO Auto-generated method stub
	}

	@SuppressWarnings("unchecked")
	public void mousePressed(MouseEvent e)
	{
		// get measurement values and send them to line chart
		
		if(isMousePressed())
			return;
		
		setMousePressed(true);
		
		JTable table = (JTable) e.getSource();
		MyTableModel model = (MyTableModel) table.getModel();
		Point pt = e.getPoint();
		int index = table.columnAtPoint(pt);
		if(index+1 == table.getModel().getColumnCount())
			return;
		Vector values = new Vector();
		for(int j = 0; j <= WorkingSet.getActualSensors(); j++)
		{
			if(j == 0)
				values.add(new Double(0.0));
			else
				values.add(new Double(WorkingSet.getCertainValue(index, j-1)));
		}
		
		if(!TableController.isKeyPressed())
		{
			LineDatasetController.removeAllMeasurement();
			model.clearSelectedColums();
		}
		
		LineDatasetController.addMeasurement(values);
		model.addSelectedColumn(index);
		return;
		
	}

	public void mouseReleased(MouseEvent e)
	{
		// TODO Auto-generated method stub
		setMousePressed(false);
		
	}

	public void mouseEntered(MouseEvent e)
	{
		// TODO Auto-generated method stub
		
	}

	public void mouseExited(MouseEvent e)
	{
		// TODO Auto-generated method stub
		
	}

	private boolean isMousePressed()
	{
		return mousePressed;
	}

	private void setMousePressed(boolean mousePressed)
	{
		this.mousePressed = mousePressed;
	}
}

Code:
public class MyCellRenderer extends JLabel implements TableCellRenderer
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public MyCellRenderer()
	{
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
 boolean hasFocus, int row, int column)
	{
		// set the default color for a cell
		setForeground(Color.BLACK);
		setBackground(Color.WHITE);
		
		MyTableModel model = (MyTableModel) table.getModel();
		
		if(value instanceof String)
		{
			if(value.toString().equals(" "))
			{
				setText(" ");
				return this;
			}				
			
			// determine if the cells value is out of tolerance
			double d = Double.parseDouble(value.toString());
			double t = WorkingSet.getActualTolerance();
			
			if((d > t) || (d < t*-1))
				setForeground(Color.RED);
			
			setText(value.toString());
			
			// set the background color of the cells
			setBackground(model.getCellColor(column));
		}
		
		return this;
	}
}

Ich hoffe es hilft vielleicht dem ein oder anderen.

Gruß
Maik
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben