JTable - warum funktioniert mein CellRenderer nicht?

Status
Nicht offen für weitere Antworten.

Kiamur

Aktives Mitglied
Hallo!

Ich möchte in meiner Tabelle den Text der darzustellenden Strings in unterschiedlichen Farben darstellen.

Dazu habe ich mir eine Cell Renderer geschrieben, der so aussieht:

Code:
public class MyCellRenderer extends JLabel implements TableCellRenderer
{

	
	public MyCellRenderer()
	{
		setOpaque(true);
	}

	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
	{
		setForeground(Color.RED);
		
		return this;
	}

}

Ich habe mich dabei am Tutorial hier im Forum orientiert.

Ich habe auch ein eigenes TableModel geschrieben, das so aussieht:

Code:
public class MyTableModel extends DefaultTableModel
{
	public MyTableModel(int size, int i)
	{
		super(size, i);
	}

	// make all cells NOT editable
	public boolean isCellEditable(int rowIndex, int ColumnIndex)
	{
		return false;
	}
}

Den CellRenderer habe ich dann so meiner Tabelleninstanz übergeben:

Code:
table.setDefaultRenderer(String.class, new MyCellRenderer());

Leider wird der Text in der Tabelle nicht rot dargestellt, sondern immer noch schwarz. Auch konnte ich so nicht die Hintergrundfarbe der Zellen ändern. Es tut sich einfach gar nichts. Könnt ihr mir sagen, was ich noch falsch mache?

Gruß
Maik
 

André Uhres

Top Contributor
Kiamur hat gesagt.:
...
Code:
table.setDefaultRenderer(String.class, new MyCellRenderer());
...
Versuch's mal so:
Code:
table.setDefaultRenderer(Object.class, new MyCellRenderer());
 
K

Kremso

Gast
Falls Andrés Vorschlag nicht funzt, versuchs mal mit
Code:
table.getColumnModel().getColumn(index).setCellRenderer(new MyCellRenderer());
 

Kiamur

Aktives Mitglied
Hallo ihr zwei!

Danke erst mal für eure Antworten. Leider funktioniert es immer noch nicht.

In der Version von André werden keine Strings mehr in die Tablle geschrieben. Es erscheint die Tabelle mit der richtigen Anzahl von Zeilen und Spalten, aber die Zellen sind grau und es steht nichts drin (das Grau kommt aber nicht von meinem CellRenderer).

In der Version von Kremso werden zwar alle Werte in die Tabelle geschrieben, aber nicht rot. Außerdem sieht die letzte Spalte genauso aus wie in der Version von André (also grau). Nur das da noch nichts drin steht ist richtig.

Der Code, wo ich Kremsos Vorschlag eingebaut habe sieht so aus: (ich denke André wird das bekannt vorkommen)

Code:
// adds a new column to the table
	public static void addNewColumn()
	{
		// add a new Column to the table
    	model.addColumn(model.getColumnCount()+1);
    	
    	// autoscroll the scrollbar to the last column
    	SwingUtilities.invokeLater(new Runnable()
    	{
    		public void run()
    		{
    			table.changeSelection(table.getSelectedRow(), table.getColumnCount(), false, false);
    			table.getColumnModel().getColumn(model.getColumnCount()-1).setCellRenderer(new MyCellRenderer());
    		}
    	});
	}

Was ich überhaupt nicht verstehe, das ist, dass die Tabelle ja Reaktionen auf den CellRenderer zeigt, wenn ich ihn einfüge. Aber leider sind es nicht die Reaktionen, die ich dort hineinprogrammiert habe:

Code:
setForeground(Color.RED);

Bitte helft mir weiter, denn ich brauche die Farben in der Tabelle.

Gruß
Maik
 

André Uhres

Top Contributor
Code:
/*
 * CellRendering2.java
 */
//package tableDemo;
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class CellRendering2 extends JFrame {
    public CellRendering2() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        JTable table = new JTable(new MyTableModel(100,4));
        table.setDefaultRenderer(Object.class, new MyCellRenderer());
        add(new JScrollPane(table));
    }
    public static void main(String args[]) {new CellRendering2().setVisible(true);}
    public class MyCellRenderer extends JLabel implements TableCellRenderer {
        public MyCellRenderer() {
            setOpaque(true);
        }
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setBackground(Color.RED);
            return this;
        }
    }
    public class MyTableModel extends DefaultTableModel {
        public MyTableModel(int size, int i) {
            super(size, i);
        }
        // make all cells NOT editable
        public boolean isCellEditable(int rowIndex, int ColumnIndex) {
            return false;
        }
    }
}
 

Kiamur

Aktives Mitglied
Hallo André!

Tja, so funktioniert das Ganze ja wunderbar, nur warum nicht in meinem Programm?

Interessant ist, dass ich in deiner Version den MyCellRenderer auch debuggen kann. D.h., wenn ich darin Haltepunkte setze, dann stoppt der Debugger auch dort. In meinem Programm kommt der Debugger nie in meinem CellRenderer "vorbei".

Das verstehe ich nicht, denn ich übergebe ihr doch auf die gleiche Art und Weise wie du.

Hier ist mal der komplette Code meines TableControllers, der die Tabellen erstellt und verwaltet. Vielleicht findest du (oder ihr) ja den Fehler, den ich gemacht habe. Ich hoffe ihr steigt da durch.

Code:
// This class creates and administrates the tables and tablepanels showing the 
// measurement values of a serie.
public class TableController
{
	private static MyTablePanel tablePanel = new MyTablePanel();
	private static MyJTable table; 
	private static Vector rowStrings = new Vector(); 
	private static MyTableModel model;
	
	private static boolean keyPressed = false;
	
	// returns the actual tablepanel object
	public static MyTablePanel returnTablePanel()
	{
		return tablePanel;
	}
	
	// creates new table object dependent on the count of sensors
	@SuppressWarnings("unchecked")
	public static void createNewTable(int rows) throws Exception
	{
		rowStrings.clear();
		
		for(int i = 0; i < rows; i++)
		{
			String s = new String("Sensor ");
			s += i+1;
			rowStrings.add(s);
		}
		
		ListModel listModel = new AbstractListModel()
        {
            /**
			 * 
			 */
			private static final long serialVersionUID = 1L;
			
			public int getSize()
            {
            	return rowStrings.size();
            }
            public Object getElementAt(int index)
            {
            	return rowStrings.get(index);
            }
        };
        
        model = new MyTableModel(listModel.getSize(), 0);
        
        // look if there ist allready data in this serie
        int sdc = WorkingSet.getActualSerieDataCount();
        int sc = WorkingSet.getActualSensors();
        for(int i = 0; i < sdc; i++)
        {
        	addNewColumn();
        	for(int j = 0; j < sc; j++)
        	{
        		String s = String.valueOf(WorkingSet.getCertainValue(i, j));
        		model.setValueAt(s, j, i);
        	}
        }
        
        // add at least 1 column to the table, or at the end of it.
        addNewColumn();
		
        // create Table as desired
		table = null;
		table = new MyJTable(model);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.setRowSelectionAllowed(false);
		table.setColumnSelectionAllowed(true);
		table.getTableHeader().setReorderingAllowed(false);
		table.setDefaultRenderer(String.class, new MyCellRenderer());
		
		// implement tooltips into the tabel
		ToolTipManager.sharedInstance().registerComponent(table);
		ToolTipManager.sharedInstance().setDismissDelay(10000);
		ToolTipManager.sharedInstance().setEnabled(true);
		
		// set the custom MouseListener class as the tables mouse listener
		table.addMouseListener(new MyTableMouseListener());		
		
		// create the row header
		JList rowHeader = new JList(listModel);
		rowHeader.setBackground(tablePanel.getBackground());
        rowHeader.setFixedCellWidth(50);
        rowHeader.setFixedCellHeight(table.getRowHeight());
        rowHeader.setCellRenderer(new RowHeaderRenderer(table));
        
        tablePanel.getScrollPane().setViewportView(table);
        tablePanel.getScrollPane().setRowHeaderView(rowHeader);
	}
	
	// adds a new column to the table
	public static void addNewColumn()
	{
		// add a new Column to the table
    	model.addColumn(model.getColumnCount()+1);
    	
    	// autoscroll the scrollbar to the last column
    	SwingUtilities.invokeLater(new Runnable()
    	{
    		public void run()
    		{
    			table.changeSelection(table.getSelectedRow(), table.getColumnCount(), false, false);
    			table.getColumnModel().getColumn(model.getColumnCount()-1).setCellRenderer(new MyCellRenderer());
    		}
    	});
	}
	
	// adds measurement values to a column
	public static void fillInValue(int row, double diffValue)
	{
		String s = String.valueOf(diffValue);
		int column = model.getColumnCount();
		table.setValueAt(s, row-1, column-1);
	}

	public static boolean isKeyPressed()
	{
		return keyPressed;
	}

	public static void setKeyPressed(boolean keyPressed)
	{
		TableController.keyPressed = keyPressed;
	}
}

Gruß
Maik
 

Kiamur

Aktives Mitglied
Hallo André!

Hmmm, so kompliziert ist die Klasse doch auch nicht, oder?

Naja, auf der Konsole kommt keine Fehlermeldung.

Das mit dem Debugger muss ich noch mal relativieren. Wenn ich einen Haltepunkt im Konstruktor setze, dann wird dieser bei der Ausführung auch erreicht. Das heisst ja dann wohl, dass der CellRenderer der Tabelle zugeordnet wurde. Aber es wird einfach nie die Methode "getTableCellRendererComponent()" aufgerufen, die ja letztendlich für das Zeichnen der Zelleninhalte zuständig ist.

Unter welchen Umständen wird diese Methode denn nun genau aufgerufen?!? Ich dachte eigentlich immer dann, wenn etwas in die Tabelle mit z.B. "setValueAt()" eingefügt wird. Der Wert, der dann in die Tabelle soll wird doch dann dem CellRenderer übergeben, und dieser entscheidet dann, wie der Wert dargestellt wird. Oder bin ich da auf dem Holzweg?!?
Aber wie kann es dann sein, dass der CellRenderer zwar der Tabelle richtig zugeordnet ist, auber nicht die Methode "getTableCellRendererComponent()" aufgerufen wird, wenn ich etwas in die Tabelle wie eben beschrieben hineinschreibe?!?

Gibt es irgendetwas, womit ich den Aufruf der Methode "getTableCellRendererComponent()" sicher provoziere?

Gruß
Maik
 

André Uhres

Top Contributor
Kiamur hat gesagt.:
...Gibt es irgendetwas, womit ich den Aufruf der Methode "getTableCellRendererComponent()" sicher provoziere?...
Das müsste die JTable API automatisch regeln.
Für mich ist dein Code ehrlich gesagt zu kompliziert, ich blicke da kaum durch.

Ich schlage vor du machst dir erstmal ein einfaches Beispiel das funktioniert.
Davon gehst du dann aus um es schrittweise zu erweitern. Wenn dann ein Problem kommt,
dann weisst du genau dass es durch die letzte Erweiterung bedingt ist und brauchst nicht stundenlang
oder tagelang nach der Ursache zu suchen.

Das mag vielleicht jetzt übertrieben klingen.
Dennoch glaube ich, daß es der schnellste Weg zur Lösung ist.
 

Kiamur

Aktives Mitglied
Hallo!

Nach einer langen Nacht habe ich es jetzt hinbekommen. Das komische ist, dass ich nicht so genau weiss, wo mein Fehler nun eigentlich war. Ich denke mal es lag an meinem Unwissen, was diese CellRenderer Thematik betrifft.

Wenn man so einen CellRenderer schreibt, dann muss man ihm ja wirklich ALLES mit auf den Weg geben, was er machen soll. Wenn man gar nichts reinschreibt, dann ergibt sich genau der Effekt, den ich weiter oben beschrieben habe. Nämlich, dass alle Zellen grau sind und nichts drin steht. Mein CellRenderer sieht jetzt so aus und macht seine Arbeit auch ganz gut:

Code:
// custom cell renderer makes the overstepping of the tolerance visible
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);
		
		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());
			
			if(isSelected)
				setBackground(Color.BLUE);
		}
		
		return this;
	}
}

Allerdings habe ich jetzt wieder ein Problem, doch dafür mache ich dann mal einen neuen Thread auf.

Gruß
Maik

. . . und Sorry für meine lange Leitung . . .
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
A remove(Component) funktioniert nicht; JTable AWT, Swing, JavaFX & SWT 4
D Jtable mit Dropdown Menü erweitern funktioniert nicht AWT, Swing, JavaFX & SWT 5
K Swing setPreferredWidth für JTable funktioniert nur beim ersten Aufruf!? AWT, Swing, JavaFX & SWT 8
bERt0r Swing JTable.setDefaultRenderer funktioniert nicht AWT, Swing, JavaFX & SWT 3
F Swing JTable.setCellEditor funktioniert nicht AWT, Swing, JavaFX & SWT 2
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
Roumeo Swing Verzweifle: JTable funktioniert nicht ganz wie es soll... AWT, Swing, JavaFX & SWT 12
O JTable RowSelection funktioniert nicht nach ColumSort AWT, Swing, JavaFX & SWT 2
G JTable - getRowCount() funktioniert nicht AWT, Swing, JavaFX & SWT 2
U JTable.setEnabled(false) funktioniert nicht ! AWT, Swing, JavaFX & SWT 3
K JTable - wieso funktioniert der Autoscroll nicht? AWT, Swing, JavaFX & SWT 5
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
B JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 1
J JTable und Suchlogik AWT, Swing, JavaFX & SWT 4
Viktim Swing JTable mit Tab verlassen AWT, Swing, JavaFX & SWT 1
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
Viktim Swing JTable Mit Tab druch Zeilen Wechseln AWT, Swing, JavaFX & SWT 5
Thallius Warum refrehsed mein JTable nicht? AWT, Swing, JavaFX & SWT 5
Ghostman1711 Hinzufügen ausgewählter Dateinen des Filechoosers zu einem JTable AWT, Swing, JavaFX & SWT 9
S Swing JTable - Einzelne Rows einfärben AWT, Swing, JavaFX & SWT 11
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
K JTable getValueAt() klappt nicht immer AWT, Swing, JavaFX & SWT 1
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
P JTable - bei Eingabe Selektion AWT, Swing, JavaFX & SWT 0
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
S Swing Deselektion in JTable verhindern AWT, Swing, JavaFX & SWT 0
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
N Swing Print JTable mit AbstractTableModel AWT, Swing, JavaFX & SWT 1
Ananaskirsche Swing jTable Reihen zuviel eingefügt AWT, Swing, JavaFX & SWT 12
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
T Swing JTable wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
S Dreiecke in bestimmte Zellen einer JTable AWT, Swing, JavaFX & SWT 9
LexeB4F Zelle in JTable gezielt einfärben AWT, Swing, JavaFX & SWT 4
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
D Swing JTable Renderer Grafikfehler AWT, Swing, JavaFX & SWT 0
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
M Swing JTable GroupableHeader Background Color AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben