JTable CellRenderer

=fire=

Erfahrenes Mitglied
Hallo,

ich habe folgenden Cell Renderer:

Java:
        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?

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

)
);
 
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
 
Hallo,

ich habe mir nun einen gebaut:

Java:
    	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.
Java:
table.setDefaultRenderer( Object.class, new testRender());
table.setDefaultRenderer( Boolean.class, new testRender());
 
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
Java:
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
Java:
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
 
Hallo,

habe noch ein anderes Problem:

Java:
    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?
 
Funktioniert so leider nicht:

Java:
		table.setColumnSelectionAllowed(false);
		table.setRowSelectionAllowed(true);
 
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.
 
Achja, sorry, hatte da gerade einen Denkfehler.
Ändere bei deinem Renderer mal hasFocus zu isSelected.

Gruß

Sascha
 
Zurück