JTable CellRenderer über boolean

Status
Nicht offen für weitere Antworten.

freez

Top Contributor
Hallo,

ich habe euer sehr gutes Tutorial über JTable gelesen. Nun wollte ich natürlich das für mein eigenes Projekt nutzen. Ich möchte gern die Checkbox an manchen stellen ausblenden, wenn die Spalte den Typ Boolean hat. Folgenden Code habe ich:
Code:
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
	{		
		if(value instanceof Boolean)
		{
			JLabel lbl = new JLabel("Hallo");
			return lbl;
		}
		return new JLabel(value.toString());
	}
Stört euch nicht daran, daß es so erst mal keinen Sinn ergibt alle Checkboxen mit einem JLabel("Hallo") zu überschreiben. Es ist nur ein Test, und soll später nur auf einzelne Zellen angewant werden. Und zwar mit einem leeren JLabel(""). Das Ziel ist es an bestimmten Stellen die Checkbox einfach auszublenden.

Er blendet mir aber nichts weg. Alle Checkboxen bleiben. Im Tutorial funktioniert es. nur finde ich den Unterschied nicht. dort werden die Checkboxen durch yes oder no überschrieben (
http://www.java-forum.org/de/viewtopic.php?t=7708 )

Oder gibt es vielleicht noch einen anderen Weg die Checkboxen auszublenden?

Hier noch mein TableModel:
Code:
public class JCheckboxTableModel extends AbstractTableModel
{
	String [] fileNames;
	String [] fullPath;
	boolean [] toDownload;
	int [] positions;
	
	/**
	 * @param fileNames
	 * @param fullPath
	 * @param toDownload
	 * @param positions
	 */
	public JCheckboxTableModel(String[] fileNames, String[] fullPath,
					boolean[] toDownload, int[] positions)
	{
		super();
		this.fileNames = fileNames;
		this.fullPath = fullPath;
		this.toDownload = toDownload;
		this.positions = positions;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getColumnCount()
	 */
	public int getColumnCount()
	{
		return 3;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getRowCount()
	 */
	public int getRowCount()
	{
		return fileNames.length;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#getValueAt(int, int)
	 */
	public Object getValueAt(int rowIndex, int columnIndex)
	{	
		switch( columnIndex )
		{
        case 0: if(fileNames[ rowIndex ] != null && rowIndex < fileNames.length)
        			return new String(fileNames[ rowIndex ]); break;
        case 1: if(rowIndex < toDownload.length)
        			return new Boolean( toDownload[ rowIndex ] ); break;
        case 2: if(fullPath[ rowIndex ] != null && rowIndex < fullPath.length)
					return new String(fullPath[ rowIndex ]); break;
        default: return null;
		}
		return null;

	}
    // Eine Angabe, welchen Typ von Objekten in den Columns angezeigt werden soll
    public Class getColumnClass(int columnIndex) {
       switch( columnIndex ){
          case 0: return String.class;
          case 1: return Boolean.class;
          case 2: return String.class;
          default: return null;
       }
    }
    // nur die 2. Spalte darf editiert werden
	public boolean isCellEditable(int rowIndex, int columnIndex) 
	{
		if(columnIndex == 1)
			return true;
		else 
			return false;
	}

	/* (non-Javadoc)
	 * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
	 */
	public void setValueAt(Object aValue, int rowIndex, int columnIndex)
	{
		switch( columnIndex )
		{
		case 0: if(fileNames[ rowIndex ] != null && rowIndex < fileNames.length)
					fileNames[ rowIndex ] = ((String )aValue).toString(); break;
		case 1: if(rowIndex < toDownload.length)
					toDownload[ rowIndex ] = ((Boolean)aValue).booleanValue(); break;
		case 2: if(fullPath[ rowIndex ] != null && rowIndex < fullPath.length)
					fullPath[ rowIndex ] = ((String )aValue).toString(); break;
		default: return;	        
		}
	}
    
	// Die Titel der einzelnen Columns
    public String getColumnName(int column) {
       switch( column ){
          case 0: return "FileName";
          case 1: return "Download?";
          case 2: return "komplette Adresse";
          default: return null;
       }
    }
}

Vielen Dank schon mal im vorraus.
 

freez

Top Contributor
Hm, eins habe ich schon herrausgefunden. in meinem Renderer springt er in die IF Abfrage nicht rein. Wieso auch immer. Aber durch die letzte return Zeile müßte er doch sowieso ein JLabel anzeigen, statt einer CheckBox, oder?
 

freez

Top Contributor
Das stimmt: normalerweise sollte man ableitet. In meiner ersten Version habe ich aber mit noch anderen Komponenten gearbeitet, die ich zurückgeben wollte (z.B. JPane mit Image). Somit war das in dem Moment nicht sinnvoll (meine ich jedenfalls). Wenn es bei dem Label bleibt mache ich das natürlich so. Ist ja schöner :)

So, hier mal zu deiner Frage:
Code:
public class JCheckboxTable extends JTable
{
	JCheckboxTableModel model;
	JCheckboxTableRenderer renderer;

	/**
	 * @param fileNames
	 * @param toDownload
	 * @param fullNames
	 * @param positions
	 */
	public JCheckboxTable(String[] fileNames, boolean[] toDownload, String[] fullNames, int[] positions)
	{
		model = new JCheckboxTableModel(fileNames,fullNames,toDownload,positions);
		int maxLength = 0;
			for(int i = 0; i < fileNames.length; i++)
				if(fileNames[i].length() > maxLength)
					maxLength = fileNames[i].length();
				
		renderer = new JCheckboxTableRenderer(positions, maxLength);
		this.setModel(model);		
		this.setDefaultRenderer(Object.class, renderer);
		this.setShowGrid(false);
		
		
	}

	public static void main(String[] args)
	{
		String [] a = {"", "GIF", "", "a", "b", "", "JPG", "", "c", "d", "", "PNG", "", "e", "f", "g", "h"};
		String [] b = {"", "", "", "a", "b", "", "", "", "c", "d", "", "", "", "e", "f", "g", "h"};
		boolean [] c = {false,true,false,true,true,false,true,false,true,true,false,true,false,true,true,true,true};
		int [] d = {0, 5, 10};
		JCheckboxTable table = new JCheckboxTable(a, c , b, d);
		JFrame frame = new JFrame("TITEL");
		frame.getContentPane().add(new JScrollPane(table));
		frame.setVisible(true);
		frame.pack();
	}
}

Obwohl, ich sehe gerade, wenn ich nur die Booleans ändern will, könnte ich beim DefaultRenderer ja Boolean.class angeben ... das probiere ich als nächstes
 

freez

Top Contributor
So, das Problem lüftet sich. setze ich den Default Renderer auf Boolean.class funzt es. Wieso geht es nicht mit Object.class?
 
B

Beni

Gast
Weil es einen DefaultRenderer für Boolean gibt.

Wenn die Tabelle die Klasse einer Spalte abfragt, geht sie den Vererbungsbaum hoch, und guckt, ob es da einen entsprechenden Renderer gibt. Wenn sie ein Boolean.class bekommt, gibt es gleich bei "Boolean" einen Eintrag (die Tabelle selbst generiert einen Renderer für Boolean's), und "Object" wird gar nicht erst abgefragt.
 
G

Guest

Gast
Eine Anmerkung zwischendurch, da mir schlecht wird, wenn ich sowas sehe... ;)

Erstelle das Label-Objekt (oder was auch immer) nicht in der Methode "getTableCellRendererComponent(...)"
Die Methode wird u.U. zig mal in der Sekunde aufgerufen, wodurch auch hunderte von Labels erstellt werden.
Klartext: Wiederverwenden, statt immer wieder neu Instanzieren.
 

freez

Top Contributor
Hallo Beni,

wieso funktioniert es dann im Tutorial. Dort wurde auch Object.class angegeben und im Renderer dann abgefragt, was denn "value" eigentlich ist.
Mein Problem ist, daß ich je nach Zelle andere Objekte dort einfügen möchte. zB. eine Grafik, Ein JLabel usw. Somit ging ich nach dem Tutorial und habe Object.class angegeben. Ich will ja jede Zelle einzeln im Renderer bearbeiten.

@Gast: Danke, auf die Idee bin ich gar nicht gekommen. Natürlich werde ich es dann in der final Version entsprechend machen :)
 
B

Beni

Gast
freez, es gibt einen Unterschied zwischen deinem TableModel, und dem TableModel in dem Tutorial:
Das Model im Tutorial gibt für jede Spalte als Klasse "Object.class" an:
Code:
      public Class getColumnClass(int columnIndex) {
         return Object.class;
      }

Dein Model hingegen gibt auch andere Klassen an:
Code:
    public Class getColumnClass(int columnIndex) {
       switch( columnIndex ){
          case 0: return String.class;
          case 1: return Boolean.class;
          case 2: return String.class;
          default: return null;
       }
    }

Das JTable im Tutorial guckt immer als erstes nach, ob es einen Renderer für "Object" gibt, und ja, es gibt einen (der wurde ja extra registriert).
Bei deinem Code hingegen wird zuerstmal nachgeschaut, ob es z.B. was für "Boolean" gibt (und ja, es gibt was. Automatisch vom JTable hergestellt).
 

freez

Top Contributor
:) Ich weiss :) Aber bei mir war der Ansatz wegen den Verschiedenen Objekten, die ich zurückgeben will und nur von einem erben kann. Im Tutorial war ja das Beispiel mit dem Label und da wurde ja this zurückgegeben. Deswegen habe ich nicht daran gedacht die ausserhalb zu instanziieren. Es war auch mein erster Versuch ... Verzeiht mir meine anfängerfehler :)

Tja, das Problem hat sich zwar etwas gelüftet, aber wie kann ich alle Zellen mit einem Renderer bearbeiten. Das Problem ist weiterhin da, daß ich die Checkboxen nicht ausblenden kann (Also, daß mir ein leeres Label gezeichnet wird, statt einer Checkbox).
 

freez

Top Contributor
So, ich habe es nun folgendermaßen gelöst,

Code:
public JCheckboxTable(String[] fileNames, boolean[] toDownload, String[] fullNames, int[] positions)
{
	model = new JCheckboxTableModel(fileNames,fullNames,toDownload,positions);
	int maxLength = 0;
		for(int i = 0; i < fileNames.length; i++)
			if(fileNames[i].length() > maxLength)
				maxLength = fileNames[i].length();
			
	renderer = new JCheckboxTableRenderer(positions, maxLength);
	this.setModel(model);		
	this.setDefaultRenderer(Object.class, renderer);
	this.setDefaultRenderer(Boolean.class, renderer);
	this.setShowGrid(false);	
}

@Beni: natürlich hast du recht ... habe an dem Abend net ganz kapiert, was du wolltest ... sorry

Ich habe jetzt einfach einen 2. DefaultRenderer für Boolean gesetzt. Und JLabel und JCheckbox habe ich nun auch ausserhalb vom cellRenderer erstellt (wiederverwenden statt neu erstellen :)).

Noch ein Tip: vom JLabel setOpaque(true) setzten, damit die Hintergrundfarbe von JLabel angezeigt wird. Das war auch noch ein kleines Problem bei mir :)

Also, vielen Dank für die Hilfe ... war echt informativ
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
B JTable CellRenderer AWT, Swing, JavaFX & SWT 5
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
E Swing JTable mit CellRenderer AWT, Swing, JavaFX & SWT 7
H JTable und CellRenderer AWT, Swing, JavaFX & SWT 2
M CellRenderer in JTable AWT, Swing, JavaFX & SWT 11
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
G JTable: Zellenhöhe mit neuem CellRenderer & Editor AWT, Swing, JavaFX & SWT 17
C JTable mit JPanel als CellRenderer AWT, Swing, JavaFX & SWT 2
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4
I Swing JTable zeichnet kein vertical Grid AWT, Swing, JavaFX & SWT 6
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
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
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
J JTable Selection Listener funktioniert nicht 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

Ähnliche Java Themen


Oben