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
 
G

Gast

Gast
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
 
B

Beni

Gast
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.
 

Kiamur

Aktives Mitglied
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
 

Kiamur

Aktives Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaFX Verständnisfrage mit parametrisierten Methoden und FXML AWT, Swing, JavaFX & SWT 21
B JavaFX Verständnisfrage EventHandler<ActionEvent> Implementierung in meiner Klasse AWT, Swing, JavaFX & SWT 2
B JavaFX Grundlegende Verständnisfrage JavaFX<->Scene Builder AWT, Swing, JavaFX & SWT 12
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
M Swing JButton-Konstruktor Icon-Parameter (Verständnisfrage) AWT, Swing, JavaFX & SWT 7
S Verständnisfrage EventListener AWT, Swing, JavaFX & SWT 6
S Verständnisfrage anonye Klasse ActionListener AWT, Swing, JavaFX & SWT 4
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
hdi Swing Erstmaliges setVisible - Verständnisfrage AWT, Swing, JavaFX & SWT 5
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
V Verständnisfrage: Welche Positionierungskonstanten? AWT, Swing, JavaFX & SWT 4
V Verständnisfrage Text und anschließende Bildausgabe? AWT, Swing, JavaFX & SWT 6
R Verständnisfrage BufferStrategy: g.dispose() AWT, Swing, JavaFX & SWT 3
A Verständnisfrage zur Ereignisbehandlung AWT, Swing, JavaFX & SWT 5
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
S Verständnisproblem mit CellRenderer AWT, Swing, JavaFX & SWT 1
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
Spin CellRenderer Probleme bei JList AWT, Swing, JavaFX & SWT 4
S Swing Jlist - CellRenderer/ Selektion AWT, Swing, JavaFX & SWT 2
B JTable CellRenderer AWT, Swing, JavaFX & SWT 5
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
C Wieso funktionert der CellRenderer nicht? AWT, Swing, JavaFX & SWT 2
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
E Swing JTable mit CellRenderer AWT, Swing, JavaFX & SWT 7
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
? Tabelle formatieren - auch ohne CellRenderer? AWT, Swing, JavaFX & SWT 6
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
H JTable und CellRenderer AWT, Swing, JavaFX & SWT 2
M CellRenderer in JTable AWT, Swing, JavaFX & SWT 11
D JList Cellrenderer fügt mehrfach ein AWT, Swing, JavaFX & SWT 2
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
G [Problem] CellRenderer und ActionCommand AWT, Swing, JavaFX & SWT 5
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
G CellRenderer, der einige ImageIcons aneinanderreiht AWT, Swing, JavaFX & SWT 5
G JTable: Zellenhöhe mit neuem CellRenderer & Editor AWT, Swing, JavaFX & SWT 17
G CellRenderer funkt net AWT, Swing, JavaFX & SWT 5
T CellRenderer funzt net AWT, Swing, JavaFX & SWT 20
F JTable CellRenderer über boolean AWT, Swing, JavaFX & SWT 12
M Krieg keine CellRenderer Methode hin :( AWT, Swing, JavaFX & SWT 12
C JTable mit JPanel als CellRenderer AWT, Swing, JavaFX & SWT 2
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben