JPanel-Zeilen abwechselnd einfärben

DealeyLama

Mitglied
Hallo

Ich hab' mir einen eigenen TableCellRenderer geschrieben, der es mir ermöglichen soll abwechselnd die Zeilen einer JTable-Tabelle einzufärben.
Dafür müsste ich die Nummer der aktuell gezeichneten Zeile wissen, um zu entscheiden wie sie gefärbt werden soll. Leider finde ich keine Möglichkeit diese festzustellen.
Kann mir bitte Jemand einen Tipp geben wie ich an diesen Wert komme?

Vielen Dank im voraus und schönen Abend noch

Alexander Schell
 
Code:
for (int i = 0; i < myTable.getRowCount(); i += 2) {
  myTable.setRowSelectionInterval(i, i);
  myTable.setSelectionBackground(Color.yellow);
}
 
Deine Frage verstehe ich zwar, wundere mich aber darüber.
Ein TableCellRenderer hat grundsätzlich folgende Routine:
Code:
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,  boolean hasFocus,  int row,  int column);

In anderen Worten, du bekommst Deine Zeilen- und deine Spaltennummern.

Ich selbst habe es mir angewönt sogenannte Colormodelle zu erschaffen, die von allen meinen Renderern verwendet werden. Das hat den Vorteil, dass Du nicht wegen einer Farbe, die bei welchen Umständen auch immer gesetzt werden sollen, jedesmal einen extra Renderer gebaut werden muß. Wird meinen Renderern kein Colormodell mitgegeben, so gehen sie von den Default-Farben der Tabelle aus. Das erspart einen Haufen Arbeit da du nur Deine Custom-Renderer mit einem gewünschten Colormodell kombinieren brauchst.

mein Interface für Colormodelle sieht wie folgt aus:

Code:
import java.awt.*;
import javax.swing.*;

public interface TableCellColorModel
{
    Color getForegroundColor(JTable table,
                             Object value,
                             boolean isSelected,
                             boolean hasFocus,
                             int row,
                             int column);

    Color getBackgroundColor(JTable table,
                             Object value,
                             boolean isSelected,
                             boolean hasFocus,
                             int row,
                             int column);

}

das Default-Colormodel welches jeder meiner Renderer verwendet, wenn nichts anderes gegeben, so:

Code:
public class DefaultTableCellColorModel implements TableCellColorModel
{

    public Color getForegroundColor(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Color color;
        if (isSelected)
        {
            color = table.getSelectionForeground();
        }
        else
        {
            color = table.getForeground();
        }
        return color;
    }

    public Color getBackgroundColor(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
    {
        Color color;
        if (isSelected)
        {
            color = table.getSelectionBackground();
        }
        else
        {
            color = table.getBackground();
        }
        return color;
    }
}

und hier noch einer meiner Beispiel-Renderer
Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;


public class StringCellRenderer extends JLabel implements TableCellRenderer
{
        static protected  Border    m_noFocusBorder = new EmptyBorder(1, 1, 1, 1);

        private TableCellColorModel m_colorModel = new DefaultTableCellColorModel();

        private Color               m_unselForeGround;
        private Color               m_unselBackGround;

        public StringCellRenderer()
        {
            setOpaque(true); //MUST do this for background to show up.
        }

        protected void setValue(Object value)
        {
            if (value!=null)
            {
                setText(value.toString());
            }
            else
            {
                setText("");
            }
        }

        public Component getTableCellRendererComponent(JTable table,
                                                       Object value,
                                                       boolean isSelected,
                                                       boolean hasFocus,
                                                       int row,
                                                       int column)
        {
//            System.out.println("   value="+value+";isSelected="+isSelected+";hasFocus="+hasFocus+";row="+row+";column"+column);
            setValue(value);

            if(m_colorModel!=null)
            {
                super.setForeground(m_colorModel.getForegroundColor(table,
                                                                    value,
                                                                    isSelected,
                                                                    hasFocus,
                                                                    row,
                                                                    column));

                super.setBackground(m_colorModel.getBackgroundColor(table,
                                                                    value,
                                                                    isSelected,
                                                                    hasFocus,
                                                                    row,
                                                                    column));
            }
            else if (isSelected)
            {
                super.setForeground(table.getSelectionForeground());
                super.setBackground(table.getSelectionBackground());
            }
            else
            {
                super.setForeground((m_unselForeGround != null) ? m_unselForeGround
                                                                : table.getForeground());
                super.setBackground((m_unselBackGround != null) ? m_unselBackGround
                                                                : table.getBackground());
            }


            setFont(table.getFont());

            if (hasFocus)
            {
                setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
                if (table.isCellEditable(row, column))
                {
                    super.setForeground(UIManager.getColor(
                                        "Table.focusCellForeground"));
                    super.setBackground(UIManager.getColor(
                                        "Table.focusCellBackground"));
                }
            }
            else
            {
                setBorder(m_noFocusBorder);
            }

            return this;

        } // end of getTableCellRendererComponent(JTable, Object, boolean, boolean, int, int)

        public void setCellColorModel (TableCellColorModel colorModel)
        {
            this.m_colorModel = colorModel;
        }

        public TableCellColorModel getCellColorModel()
        {
            return m_colorModel;
        }

        public void setForeground(Color c)
        {
            super.setForeground(c);
            m_unselForeGround = c;
        }

        public void setBackground(Color c)
        {
            super.setBackground(c);
            m_unselBackGround = c;
        }
}

ich habe mal meine eigenenen Package Bezeichnungen weggelassen, da du sicher Deine eigene Ordnung hast.

Takidoso
 
Erstmal vielen Dank euch beiden für die Tipps...
Ich hab' nach einigem fluchen, suchen und herumspielen folgenden Lösung gebaut:

Code:
  /*
   * CellRendererKunden.java
   *
   * Created on 4. Februar 2005, 00:28
   */
  
  package winterorbit2;
  
  /**
   *
   * @author schell
   */
  import javax.swing.table.DefaultTableCellRenderer;
  import javax.swing.*;
  import java.awt.Font;
  import java.awt.Color;
  import java.awt.Component;
  
  public class CellRendererKunden extends DefaultTableCellRenderer {
  	
  	final static int NORMAL = 0;
  	final static int BOLD = 1;
  	final static int CENTER = 10;
  	final static int LEFT = 11;
  	final static int RIGHT = 12;
  	private int nStyle;
  	private int nAlignment;
  	private Component comp;
  	private int nComponentRow;
  	private boolean bIsSelected;
  	
  	/** getTableCellRendererComponent */
  	public Component getTableCellRendererComponent(JTable table,
  			Object value, boolean isSelected, boolean hasFocus,
  			int row, int column) {
  		
  		this.nComponentRow = row;
  		this.bIsSelected = isSelected;
  		this.comp = super.getTableCellRendererComponent(table,
 			    value, isSelected, hasFocus, row, column);
  		return this.comp;
  		
  	}
  	
  	/** Creates a new instance of CellRendererKunden */
  	public CellRendererKunden(int nStyle, int nAlignment) {
  		this.nStyle = nStyle;
  		this.nAlignment = nAlignment;
  	}
  	
  	/** setValue() */
  	protected void setValue(Object value) {
  		
  		String strValue = value.toString();
  		switch(this.nAlignment) {
  			
 			case CENTER : this.setHorizontalAlignment(JLabel.CENTER); break;
  			case LEFT : this.setHorizontalAlignment(JLabel.LEFT); break;
 			case RIGHT : this.setHorizontalAlignment(JLabel.RIGHT); break;
  			default : this.setHorizontalAlignment(JLabel.LEFT); break;
  			
  		}
  		Font font = this.getFont();
  		switch(this.nStyle) {
  			
 			case BOLD : this.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); break;
  			
  		}
  		if(this.bIsSelected) {
  			this.setBackground(new Color(190, 190, 220));
  		} else if((this.nComponentRow % 2) == 1) {
  			this.setBackground(new Color(220, 220, 220));
  		} else {
  			this.setBackground(new Color(245, 245, 245));
  		}
  		this.setForeground(Color.BLACK);
  		this.setText(strValue);
  		
  	}
  	
  }

Ich war scheint's leider - übermüdet wie ich war - gestern nacht nicht in der Lage die Docs richtig zu lesen. Ich habe glatt die getTableCellRendererComponent-Methode überlesen. Tut mir sehr leid...
Die Lösung mit dem eigenen ColorModel gefällt mir sehr gut.Ich denke die werde ich übernehmen...

Schönes Wochenende noch und nochmals vielen Dank

Alexander Schell
 
Hallo!

Warum nicht einfach so?
Code:
/*
 * Created on 18.02.2005@19:34:31
 *
 * TODO Licence info
 */
package de.tutorials;

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

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class ColoredJTableExample extends JFrame {

    private JTable table;

    private final Color ODD = new Color(0x99, 0xCC, 0xFF);

    private final Color EVEN = new Color(0xFF, 0xFF, 0xCC);

    private Object[][] rowData = { { "a0", "b0", "c0" }, { "a1", "b1", "c1" },
            { "a2", "b2", "c2" }, { "a3", "b3", "c3" }, { "a4", "b4", "c4" } };

    private Object[] header = { "A", "B", "C" };

    public ColoredJTableExample() {
        super("CooloredJTableExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        table = new JTable(rowData, header);
        table.setDefaultRenderer(Object.class, new ColoredTableCellRenderer());
        JScrollPane sp = new JScrollPane(table);
        sp.setPreferredSize(table.getPreferredSize());
        getContentPane().add(sp);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new ColoredJTableExample();
    }

    class ColoredTableCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table,
                Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {

            Component c = super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);

            if (row % 2 == 0) {
                c.setBackground(EVEN);
            } else {
                c.setBackground(ODD);
            }

            return c;
        }
    }
}

Gruß Tom
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück