# JTable CellRenderer



## =fire= (16. Februar 2011)

Hallo,

ich habe folgenden Cell Renderer:


```
JTable table = new JTable( model ) {
            public Component prepareRenderer(
                    TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (!isRowSelected(row)) {
                    c.setBackground(row % 2 == 0 ? null : Color.LIGHT_GRAY );
                }
                return c;
            }
        };
```

Kann ich diesen auch anders der Table zuweisen? 


```
JTable table = new JTable( model ) ;
table.setDefaulteCellRenderer(
public Component prepareRenderer( ...

)
);
```


----------



## zerix (16. Februar 2011)

Hallo, 

du hast ja da keinen CellRenderer. Du überschreibst eine Methode der Tabelle, bei der der Renderer abgefragt wird. 
Sinnvoll wäre es, wenn du einen richtigen CellRenderer schreiben würdest. 
Schau dir dazu mal das Interface TableCellRenderer an. 

Gruß

Sascha


----------



## =fire= (17. Februar 2011)

Hallo,

ich habe mir nun einen gebaut:


```
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    		//setForeground( Color.BLACK );
    		setBackground(row % 2 == 0 ? null : Color.LIGHT_GRAY );
    		if( value instanceof Boolean ){
                if( ((Boolean)value).booleanValue() )
                    setText( "true" );
                else
                    setText( "false" );
            } else {
            	setText( value.toString());
            }
            if( hasFocus ){
                setBackground( Color.red );
            }
            
			return this;
        }
```

Nur leider hat mein Boolean feld nun keine Checkbox mehr sondern nur true bzw. fals, wie mache ich das?

Wenn ich die 2. Zeile weg lasse ist das Bool Feld nicht markiert.

```
table.setDefaultRenderer( Object.class, new testRender());
table.setDefaultRenderer( Boolean.class, new testRender());
```


----------



## zerix (17. Februar 2011)

Du hast ja auch den Renderer, den die Tabelle für Boolean hat ersetzt. Du solltest vielleicht einen umhüllenden Renderer schreiben. 

Schau mal hier

```
import java.awt.Color;
import java.awt.Component;

import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;


public class WrappingCellRenderer implements TableCellRenderer {
	
	private TableCellRenderer wrappedCellRenderer;
	
	public WrappingCellRenderer(TableCellRenderer cellRenderer) {
		super();
		this.wrappedCellRenderer = cellRenderer;
	}

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		Component rendererComponent = wrappedCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		
		if(hasFocus)
			rendererComponent.setBackground(Color.RED);
		else
			rendererComponent.setBackground(row % 2 == 0 ? null : Color.LIGHT_GRAY );

		
		return rendererComponent;
	}

}
```

Den musst du dann so setzen

```
table.setDefaultRenderer( Object.class, new WrappingCellRenderer(table.getDefaultRenderer(Object.class)));
table.setDefaultRenderer( Boolean.class, new WrappingCellRenderer(table.getDefaultRenderer(Boolean.class)));
```

So wird in diesem Renderer der normale Renderer genutzt und die Standard-Funktionalität bleibt erhalten. 

Gruß

Sascha


----------



## =fire= (18. Mai 2011)

Hallo,

habe noch ein anderes Problem:


```
public class WrappingCellRenderer implements TableCellRenderer {
    	private TableCellRenderer wrappedCellRenderer;
    	    
    	public WrappingCellRenderer(TableCellRenderer cellRenderer) {
    		super();
    		// Setzen des Originalen Renderers
    		this.wrappedCellRenderer = cellRenderer;
    	}
       @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component rendererComponent = wrappedCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                        
            rendererComponent.setForeground(Color.black); 
            if(hasFocus) {
            	rendererComponent.setBackground(new Color(100, 100, 100));
            } else {
                rendererComponent.setBackground(row % 2 == 0 ? null : new Color(213, 213, 213) );
            }
            return rendererComponent;
        }
    }
```

Dort möchte ich gerne wenn man die Zeile der Tabelle anklickt das die ganze Zeile nicht nur die Zelle markiert wird. Wie kann ich das machen?


----------



## zerix (18. Mai 2011)

Hallo,

da müsstest du normal nur den SelectionMode umstellen.

Schau mal hier
http://download.oracle.com/javase/tutorial/uiswing/components/table.html#selection

Gruß

Sascha


----------



## =fire= (18. Mai 2011)

Funktioniert so leider nicht:


```
table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(true);
```


----------



## zerix (18. Mai 2011)

Ich sagte ja auch, schau dir mal den SelectionMode an. ;-)

Gruß

Sascha


----------



## =fire= (18. Mai 2011)

Hallo,

damit kann man doch nur wählen ob man mehr wie eine zeile wählen kann. Es soll aber auch nur eine Zeile gewählt werden können nur wenn ich eine Zelle der zeile anklicke soll die ganze Zeile gewählt werden.
SINGLE_SELECTION ist schon richtig.


----------



## zerix (18. Mai 2011)

Achja, sorry, hatte da gerade einen Denkfehler. 
Ändere bei deinem Renderer mal hasFocus zu isSelected.

Gruß

Sascha


----------

