Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen

jal1976

Mitglied
Hallo,

ich habe eine JTable mit einem eigenen TableCellRenderer. Wenn ich den TableCellRenderer der JTable hinzufüge mit
Java:
table.setDefaultRenderer(Object.class, new JWebCJTableCellRenderer(this.cellBorder));
dann zeigt die Tabelle die Strings in den Zellen nicht mehr an. Wenn ich den TableCellRenderer NICHT hinzufüge, dann erscheinen die Werte in den Zellen wieder. Die Strings sind aber da, ich kann sie mir mit getValueAt(int row, int column); ausgeben lassen. Nur werden die Strings halt nicht sichtbar dargestellt in der JTable. ???:L ;(
Ich weiss im Moment einfach nicht warum... Hat jemand von euch einen Tip für mich? 😉

Hier mal die Klasse die von JTable erbt (mit inner Klasse, die JWebCTableCellRenderer):

Java:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class JWebCTable extends JTable
{
	private static final long serialVersionUID = 1L;
	private TitledBorder cellBorder = BorderFactory.createTitledBorder("");
	private static boolean cellEdit = false;
	
	public JWebCTable(DefaultTableModel _model)
	{
		super(_model);
		this.initFuncs();
		this.setValueAt("HUHUHUHU", 2, 3); // Testhalber um zu prüfen ob der Wert auch angezeigt wird
        }
	
	private void initFuncs()
	{
		this.setDefaultRenderer(Object.class, new JWebCJTableCellRenderer(this.cellBorder));
		
		TableColumnModel columnModel = this.getColumnModel();
		for(int i=0; i<columnModel.getColumnCount(); i++)
		{
			columnModel.getColumn(i).setPreferredWidth(Default.ROW_WIDTH);
		}
		
		JTableHeader header = this.getTableHeader();
		header.setResizingAllowed(false);
                header.setReorderingAllowed(false);
		header.setDefaultRenderer(new JWebCJTableHeaderCellRenderer());
		
		this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		this.setCellSelectionEnabled(true);
		this.setRowHeight(Default.ROW_HEIGHT);
		this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
	}
	
	public boolean isCellEditable(int row, int col)
	{
		return this.getCellEdit();
	}
	
	public boolean getCellEdit()
	{
		return cellEdit;
	}
	
	public static void setCellEdit(boolean _cellEdit)
	{
		cellEdit = _cellEdit;
	}
	
	private class JWebCJTableCellRenderer extends JLabel implements TableCellRenderer
	{
		private static final long serialVersionUID = 1L;
		private TitledBorder cellBorder;
		
		public JWebCJTableCellRenderer(TitledBorder _cellBorder)
		{
			this.setForeground(Default.BLACKCOLOR);
			this.setFont(Default.TABLE_FONT);
			this.setOpaque(true);
			this.cellBorder = _cellBorder;
		}
		
		@Override
		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
															boolean hasFocus, int rowIndex, int colIndex)
		{
			String cellContent = (String)table.getValueAt(rowIndex, colIndex);
			if(cellContent == null || cellContent.equals(""))
			{
				this.setBackground(Default.WHITECOLOR);
			}
			else
			{
				this.setBackground(JWebCalendar.getColorFromCellWithAnEntry());
			}
			
			if(isSelected)
			{
		        this.setBackground(Default.TABLE_SELECTION_COLOR);
			}
			this.setBorder(this.cellBorder);
			return this;
		}
	}
}

Und hier ein Teilausschnitt der Klasse wo die JWebCTable erstellt wird:

Java:
private JScrollPane createWeekTableScrollPane()
	{
		DefaultTableModel weekModel = new DefaultTableModel(this.columnNames, 6);
		JWebCTable weekTable = new JWebCTable(weekModel);
		
		JScrollPane scroll = new JScrollPane(weekTable);
		
		scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		return scroll;
	}
 
Mhm fehlt in deinem Renderer( getTableCellRendererComponent) nicht [c]setText(cellContent);[/c] ? 😀
Btw: Das Objekt bekommst du doch schon übergeben...
 
und folgendes im CellRenderer ist auch überflüssig:
[JAVA=72] String cellContent = (String)table.getValueAt(rowIndex, colIndex);
[/code]
Der Zelleninhalt steckt ja bereits in der Variable value drin, den brauch man nicht nochmal über getValueAt(...) zu holen.
 
Oh mann, ich hab den Wald vor lauter Bäumen nicht gesehen... *peinlich peinlich* :lol: 😳

Ich danke euch beiden erstmal tausendfach.
Ist mir gar nicht aufgefallen, obwohl ich den Code bestimmt schon 100mal durch geschaut habe... lach
Und das mit getValue ist natürlich auch überflüssig... logischerweise.

Vielen, vielen Dank nochmal.

Nochmal was anderes:
Ich wollte nun, das jede Zelle eine TitledBorder bekommt... das ist gar kein Problem (haben sie ja schon!).
Nur wie ich das umsetze, das auch jede Border (also jede Zelle) einen anderen Title (cellBorder.setTitle()) hat, bekomme ich im Moment nicht richtig hin.
Hab schon so einiges versucht, aber logischerweise bekommen alle Zellen (TitledBorder) denselben Wert zur Anzeige im Title....

Habt ihr vielleicht noch nen Tip für mich wie man so etwas realisieren kann? :noe:😳

vg
jal1976
 
Mhm, die Frage verstehe ich nicht, du hast die richtige Methode doch schon genannt (setTitle()) ?
Welchen Titel sollen die einzelnen Zellen denn bekommen?

Also erst einmal würde ich
Code:
this.setBorder(this.cellBorder);
in den Konstruktor verschieben.
Und dann in der Methode würde doch dein von dir angesprochener Ansatz mit
Code:
cellBorder.setTitle(String s)
funktionieren?!
 
Ich hab das setBorder() in den Konstruktor verschoben. Danke.

Wenn ich von aussen auf das jeweilige JLabel einer Zelle zugreifen möchte und dann dort setTitle() anwende, erscheint immer derselbe Titel in jeder Zelle!
Ich habe einen Wertebereich von 1-30 fortlaufend als Strings.
Wenn ich dies mit einer Schleife durchgehe und die Title (pro Zelle) setzen möchte, haben aber alle Zellen im TitledBorder die 30 stehen und sind nicht durchnummeriert... also von 1-30.

Ich hoffe ich konnte mich verständlich ausdrücken.

vg
jal1976
 
Mhm, kannst du nicht mal schnell ein kurzes Beispiel geben?
Bzw, wenn ich dich richtig verstanden habe willst du einfach jede Zelle durchnummerieren ?!
Dann würde doch wie schon gesagt
Java:
cellBorder.setTitle(String.valueOf(table.getColumnCount() * rowIndex + colIndex + 1));
in
Code:
getTableCellRendererComponent
ausreichen, oder nicht?

Ich verstehe "Wenn ich von aussen auf das jeweilige JLabel einer Zelle zugreifen möchte" noch nicht so richtig, wozu? Sorry 😳
 
Es geht darum das sich die Werte im TitledBorder in den Zellen zur Laufzeit ändern können.
Es kann auch sein das die Nummerierung nicht in der ersten Zelle (row = 0, column = 0) anfängt, sondern z.B. in der 3. Spalte der 1. Zeile (row = 0, column = 2). Und da es mehr Zellen gibt als durchnummeriert wird sollen die anderen Zellen mit setTitle(""); versehen werden...

Von aussen also denke ich mal ist es besser über table.prepareRenderer() zu gehen??!!

vg
jal1976
 
Das Thema ist ja erledigt.
Damit man nicht durcheinander kommt, erstelle ich lieber mal nen neuen Thread wegen der TitledBorder Sache.
Denn das war nur eine Zusatzfrage und hat ja eigentlich mit dem Titel des Threads nichts zu tun... 😉
vg
jal1976
 

Neue Themen


Zurück
Oben