gleicher TableCellRenderer für mehrere unterschiedliche Tabellen

Maddili

Mitglied
Hallo,

Ich habe eine TableCellRenderer implementiert undmöchte diesen für verschiedene Tabellen nutzen.

hier mein Renderer:

Java:
public class MyTableCellRenderer extends DefaultTableCellRenderer {

	public Component getTableCellRendererComponent (JTable table,
			Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
			      Component cell = super.getTableCellRendererComponent(
			                         table, obj, isSelected, hasFocus, row, column);


			   	  /*
		    	   * new Color(R,G,B,alpha);
		    	   */
			      int alpha=70;
			      if(column < 14){
			    	  cell.setBackground(new Color(143,188,143, alpha));
			      }else if(column < 26){
			    	  cell.setBackground(new Color(30,144,255, alpha));
			      }else if(column < 38){
			    	  cell.setBackground(new Color(255,250,205, alpha));
			      }else if(column <50){
			    	  cell.setBackground(new Color(155, 48, 255, alpha));
			      }else if(column < 62){
			    	  cell.setBackground(new Color(210,180,140, alpha));
			      }

             return cell;
    }

Der CellRenderer wird folgendermaßen gesetzt:

Java:
		TableColumn col;
		col = tableView.getColumnModel().getColumn(0);
		col.setCellRenderer(new MyTableCellRenderer());
// usw. für alle weiteren Columns

Jetzt ist es aber so, dass Column(0) in ALLEN Tabellen gefärbt wird.
Kann ich eine Bedingung schaffen, um abzufragen WELCHE Tabelle WAS machen soll?

table.getName().. usw. usw. habe ich bereits versucht, aber Klappt nicht.

Schönen Freitag,
Martin
 
> aber Klappt nicht.

inwiefern klappt das nicht, was ist denn dein Plan dazu,
nur etwas zu versuchen ohne Ziel, da könntest du auch gleich this.toString() verwenden..
haben die Tabellen vorher ein Name-Attribut gesetzt bekommen?

eine Alternative wäre, dass der Renderer einen Link auf die GUI kennt und so
if (table == gui.getTableXY())
vergleicht,
oder du verwendest doch mehrere unterschiedliche Renderer und gibts im Konstruktor die benötigte Konfiguration (Farbe usw.) an
 
Hi, danke dieses Problem hat sich erledigt.

ABER ich habe natürlich etwas neues für Euch:

Habe eine "FixedColumntable" erstellt. Auf dieser Tabelle rennt mein TableCellRenderer. Funktioniert jetzt auch super.

Nun habe ich mir noch eine Klasse borderCellRenderer zusammengegoogelt, um einzelne Zellen (oder auch Columns) mit einem dickeren Rand auszustatten.
Aber ich verstehe nicht ganz, WO und WIE ich diese Klasse implementieren kann.

Im Table-Model? Im Cell Renderer???

Sorry, aber ich verstehs nicht ganz.

hier der Code des BorderCellRenderers:

Java:
class MyBorderCellRenderer extends JLabel implements TableCellRenderer {
	  protected Border noFocusBorder;

	  protected Border columnBorder;

	  public MyBorderCellRenderer() {
	    noFocusBorder = new EmptyBorder(1, 2, 1, 2);
	    setOpaque(true);
	  }

	  public Component getTableCellRendererComponent(JTable table, Object value,
	      boolean isSelected, boolean hasFocus, int row, int column) {
	    if (isSelected) {
	      setForeground(table.getSelectionForeground());
	      setBackground(table.getSelectionBackground());
	    } else {
	      setForeground(table.getForeground());
	      setBackground(table.getBackground());
	    }
	    setFont(table.getFont());

	    if (hasFocus) {
	      setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
	      if (table.isCellEditable(row, column)) {
	        setForeground(UIManager.getColor("Table.focusCellForeground"));
	        setBackground(UIManager.getColor("Table.focusCellBackground"));
	      }
	    } else {
	      if (value instanceof CellBorder) {
	        Border border = ((CellBorder) value).getBorder();
	        setBorder(border);
	      } else {
	        if (columnBorder != null) {
	          setBorder(columnBorder);
	        } else {
	          setBorder(noFocusBorder);
	        }
	      }
	    }
	    setText((value == null) ? "" : value.toString());
	    return this;
	  }

	  public void setColumnBorder(Border border) {
	    columnBorder = border;
	  }

	  public Border getColumnBorder() {
	    return columnBorder;
	  }
	}

	interface CellBorder {
	  public Border getBorder();
	  public Border getBorder(int row, int column);
	  public void setBorder(Border border);
	  public void setBorder(Border border, int row, int column);
	}
 
der gepostete Code IST ein Renderer, muss so verwendet werden, wie man eben TableCellRenderer verwendet,

wenn du schon einen TableCellRenderer hast, dann musst du tatsächlich die beiden getTableCellRendererComponent()-Methoden verwurschteln
 
[...] dann musst du tatsächlich die beiden getTableCellRendererComponent()-Methoden verwurschteln

Kannst du mir vielleicht das "verwurschteln" entwurschteln? Was meinst du damit?

Der Code für den Cellrenderer ist ja relativ einfach gehalten:

Java:
public class MyTableCellRenderer extends DefaultTableCellRenderer {
 
    public Component getTableCellRendererComponent (JTable table,
            Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
                  Component cell = super.getTableCellRendererComponent(
                                     table, obj, isSelected, hasFocus, row, column);
 
 
                  
                  if(column < XYZ){
                      // tu irgendwas!
                  } 
             return cell;
    }

grüße,
Martin
 
in diese Methode, die in deinem Programm anscheinend aktiv ist, kopierst du nun den Code vom anderen Renderer, den du brauchst, z.B. beginnend mit einer Zeile
> setBorder(noFocusBorder);
wobei es in MyTableCellRenderer cell.setBorder(noFocusBorder); heißen muss, denn am Ende wird ja cell zurückgegeben, nicht this

dann wird gemeckert dass es noFocusBorder nicht gibt, also sorgst du dafür dass es da ist,
dann ganze if/else-Konstrukte einbauen usw., ganz normal programmieren

wenn du willst kannst du auch Vererbung einsetzen mit super.getTableCellRendererComponent()

zu beachten ist, dass MyBorderCellRenderer von JLabel ausgeht während cell in MyTableCellRenderer nur Component ist,
evtl. muss man das auf JLabel casten,
und wenn cell gar kein JLabel ist, dann wirds mal kompliziert

naja, alles ganz normale Dinge
 

Zurück
Oben