JTabel Textfarbe ändern

=fire=

Erfahrenes Mitglied
Hallo,

ich möchte in der JTabel die Textfarbe ändern wenn in der Zelle xxx steht. Leider ändert er so über all die Farbe:

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);
    		if(value=="xxx") {
rendererComponent.setForeground(new Color(204, 0, 0));
    		}
    		if(hasFocus) {
    			rendererComponent.setBackground(new Color(204, 0, 0));
    		} else {
    			rendererComponent.setBackground(row % 2 == 0 ? null : new Color(191, 191, 191) );
    		}
    		return rendererComponent;
    	}
    }
 
Naja ... ich kenne mich mit JTable nicht aus ... aber kannst du als Zelleninhalt auch JLabel verwenden ? Wenn ja dann baue in die JLabel einfach HTML-Code ein ... das wird von Swing automatisch interpretiert *es MUSS <html> am anfang stehen* und sollte dir dann das gewünschte Ergebnis liefern.
 
Hallo =fire=,

Am besten arbeitest du mit JLabels, HTML muss aber garnicht sein, überschreib einfach getTableCellRendererComponent volgendermaßen:

Java:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                JLabel rendererComponent = new JLabel();
                rendererComponent.setOpaque(true);
                rendererComponent.setText(value.toString());
                if(value=="xxx") {
                    rendererComponent.setForeground(new Color(204, 0, 0));
                }
                if(hasFocus) {
                    rendererComponent.setBackground(new Color(204, 150, 150));
                } else {
                    rendererComponent.setBackground(row % 2 == 0 ? null : new Color(191, 191, 191) );
                }
                return rendererComponent;
            }

(Ich habe die hintergrundfarbe für isSelekcted etwas heller gemacht damit man die "xxx" noch sehen kann)

Im Anhang ein JAR bei dem es so funktioniert.

javaDeveloper2011
 

Anhänge

  • TutorialsTabeleRenderer.jar
    6,1 KB · Aufrufe: 22
Hallo.

@javaDeveloper
So wie du es machst, sollte man es nicht machen. Da so bei jedem repaint ständig neue JLabels angelegt werden. Sowas sollte man nicht tun.

@=fire=
Die Lösung deines Poblems ist ganz einfach. Alle Renderer die die JTable schon standardmäßig besitzt sind von grafischen Komponenten abgeleitet, meist ist das von JLabel.
Als Beispiel ist der DefaultTableCellRenderer nichts anderes als ein JLabel, da von JLabel abgeleitet. Jetzt wird für jede Spalte bei der dieser Renderer genutzt wird, das gleiche JLabel genutzt. Also wenn du 100 Zellen hast, wird 100 mal das gleiche JLabel gezeichnet, bei dem die Attribute nur anders gesetzt werden.
Wenn du jetzt die Textfarbe änderst bei einer Zelle, ist diese Farbe bei allen anderen Zellen immer noch gesetzt, da es sich wie gesagt um das gleiche JLabel handelt. Daraus folgt, dass du die Farbe einfach wieder zurücksetzen musst, wenn die Zelle nicht xxx enthält.

Wie ich schon oben erwähnt hab, sollte man es nicht so machen, wie javaDeveloper es gezeigt hat, da so sehr viele unnötige Instanzen angelegt werden.

Java:
    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);
            if(value=="xxx") {
rendererComponent.setForeground(new Color(204, 0, 0));
            }
            else{
rendererComponent.setForeground(Color.black));
            }

            if(hasFocus) {
                rendererComponent.setBackground(new Color(204, 0, 0));
            } else {
                rendererComponent.setBackground(row % 2 == 0 ? null : new Color(191, 191, 191) );
            }
            return rendererComponent;
        }
    }

Gruß

Sascha
 
Zurück