JTable Zelle gezielt einfärben

ProggYLouie

Grünschnabel
Hallo

hat einer eine Ahnung wie es möglich ist eine JTable Zelle mit einem Renderer gezielt einzufärben? Mit gezielt meine ich eine Zelle über row und col ansprechen und dann einfärben.

Das muss doch irgendwie möglich sein...

thx for help!
ProggYLouie
 
Jo isses auch. Aber ich erkläre das nicht zum 1000. Mal. Such hier im Forum nach DefaultTableCellRenderer, dann solltest Du genug Treffer bekommen, die Dir weiterhelfen.
 
Hallo!

Schau mal hier:
Code:
/**
 * 
 */
package de.tutorials;

import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author Administrator
 * 
 */
public class JTableColorerExample extends JFrame {

	private JTable table;

	private int colorClm = -1, colorRow = -1;

	private static String[] header = { "Header 1", "Header 2", "Header 3" };

	private static Object[][] data = { { "A", "B", "C" }, { "D", "E", "F" },
			{ "G", "H", "I" } };

	public JTableColorerExample() {
		super("JTableColorerExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		table = new JTable(data, header);
		table.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent evt) {
				Point p = evt.getPoint();
				colorRow = table.rowAtPoint(p);
				colorClm = table.columnAtPoint(p);
			}
		});
		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
			@Override
			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int row, int column) {

				Component c = super.getTableCellRendererComponent(table, value,
						isSelected, hasFocus, row, column);

				if (row == colorRow && column == colorClm) {
					setBackground(Color.RED);
				} else {
					setBackground(Color.WHITE);
				}
				return this;
			}
		});

		add(new JScrollPane(table) {
			{
				setPreferredSize(table.getPreferredSize());
			}
		});

		pack();
		setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new JTableColorerExample();
	}

}

Gruß Tom
 
Hallo

danke für die konkrete Antwort Tom. Habs jetzt mit getTableCellRendererComponent versucht und hat geklappt, eine Zelle anzusteuern.

Doch mein Problem ist noch weng komplexer.

Ich habe eine JTable in der steht: "Name, 7 Tage" zB. jetzt hole ich mit einem StringTokenizer den Wert 7 aus der Zelle und speichere ihn als int Wert.
Soweit klappt das auch.

Jetzt mein rendering Problem:
Ich versuche jetzt das so hin zu bekommen, dass unter dem Eintrag dann 7 Zellen eingefärbt sind (eine Art angedeutete Belegung in einem Kalender). Und das funktioniert irgendwie net. Der Renderer macht immer wieder während der Laufzeit wenn ich scrolle oder so in die färbigen Einträge weiße Zellen rein und so.

Ich denke das liegt daran, dass der REnderer immer jede Zeile einzeln abfährt und dann einfärbt.

Wie könnte man das lösen?

Hier der Code von meinem Renderer:

Code:
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.*;
import java.awt.*;
import java.util.StringTokenizer;
 
class ColoredTableCellRenderer extends DefaultTableCellRenderer
{
int rowDays;
int actRow;
int rendRow;
int actCol;
 
Color lightBlue = new Color(206,226,255);
Color darkBlue = new Color(114,151,201);
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, col);
String s = value.toString();
try {
StringTokenizer tokenizer = new StringTokenizer(s,",");
String name = tokenizer.nextToken();
String days = tokenizer.nextToken();
StringTokenizer tokenizer2 = new StringTokenizer(days," ");
Integer intDays = new Integer(tokenizer2.nextToken());
rowDays = intDays.intValue();
actCol = col;
actRow = row;
}
catch (Exception e) {
//setBackground(Color.white);
}
// if (s != "") {
if (s.equals("Sa")) {
setBackground(lightBlue);
}
else if (s.equals("So")) {
setBackground(darkBlue);
}
else if (s.equals("|")) {
setBackground(Color.red);
}
else setBackground(Color.white);
}
}
else setBackground(Color.white);
//}
 
for (int r=0; r<=rowDays;r++) {
if ((actRow != 0 && actCol != 0) && (row == actRow+(rowDays-r) && col == actCol)) {
setBackground(Color.GREEN);
super.repaint();
}
}
return this;
}
public void setValue( Object value )
{
String s = value.toString();
setText(s);
}
}
 
hi nochmal

kann man das vielleicht irgendwie mit dubbleBuffering lösen, dass die eingefärbten Zellen nicht immer wechseln.

für Hilfe wäre ich sehr dankbar. Ist sehr wichtig. Mein Projekt muß fertig werden und hängt eigentlich nur noch an diesem Problem.

thx
Louie
 

Neue Beiträge

Zurück