CellRenderer funzt net

Status
Nicht offen für weitere Antworten.

T1M

Bekanntes Mitglied
Hi,
ich möchte durch buttonklick die hintergrundfarbe einer zeile, bzw. zelle einer tabelle ändern.
allerdings funktioniert es nicht richtig. :(
die tabelle liegt in einem panel, das auf einem fenster per GridBagLayout liegt. die tabelle ist ein 2d-array.

Der Listener soll sich die Zeile/zelle merken
Code:
//makiertes Zeile wird rot
        z_rot.addActionListener(new ActionListener()
        		{
        			public void actionPerformed(ActionEvent e)
        			{
        				row = table.getSelectedRow();
        				column = table.getSelectedColumn();
        				value = table.getValueAt(row, column);
                                 }
                          }

Der CellRenderer soll für den gemerkten wert die hintergrundfarbe ändern
Code:
class ColorTableCellRenderer extends DefaultTableCellRenderer
{
		
		public Component getTableCellRendererComponent(JTable table, Object value,
		         boolean isSelected, boolean hasFocus, int row, int column)
		{
			super.getTableCellRendererComponent(table, value, isSelected,
		            hasFocus, row, column);
			
		
		    Color color = (Color)value;
		    table.setBackground(Color.RED);
		    table.setSelectionBackground(Color.RED);
		    
		    setText(color.getRed() + ", " + color.getBlue() + ", " + color.getGreen());
		    setForeground(color);
		    table.setValueAt(Color.RED, row, column);
			

		    return this;
		}

Hab echt keine Ahnung mehr und durch zu vile probieren wahrscheinlich schon den halben code zerstört! :shock:

THX THX THX!
T1M
 

Sky

Top Contributor
Du musst den Wert setzen beim Button-Klick, nicht auslesen:
Code:
    z_rot.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent e ) {
        int row = table.getSelectedRow();
        int column = table.getSelectedColumn();
        table.setValueAt( Color.red, row, column );
      }
    } );

Und dein Renderer darf nur auslesen nicht setzen:
Code:
class ColorTableCellRenderer extends DefaultTableCellRenderer {

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

    Color color = ( Color )value;
    this.setBackground( color );


    setText( color == null ? "" : color.getRed() + ", " + color.getBlue() + ", " + color.getGreen() );

    return this;
  }}
 

T1M

Bekanntes Mitglied
Hmm, thx für die schnelle antwort.
allerdings schreibt er mir jetzt nur "ava.awt.Color[r=255,g=0,b=0]" in die jeweilige zelle rein. also, er hat dir farbe zu nem string umgewandelt. damit:
Code:
table.setValueAt( Color.red, row, column );

T1M
 

Sky

Top Contributor
Wie setzt du denn die Renderer??

Müßte in etwa so ausssehen:
Code:
table.getColumnModel().getColumn(...).setCellRenderer(new ...);
 

T1M

Bekanntes Mitglied
hab der table n default renderer zugewiesen.
Code:
table.setDefaultRenderer( Color.class, new ColorTableCellRenderer() );

Bin da leider net so versiert ... :oops:
 

Sky

Top Contributor
T1M hat gesagt.:
hab der table n default renderer zugewiesen.
Code:
table.setDefaultRenderer( Color.class, new ColorTableCellRenderer() );

Bin da leider net so versiert ... :oops:
Nein das ist schon ok!
Jetzt musst Du nur noch der Tabelle sagen, wann dieser angewandt werden soll! Dies kannste du mittels überschreiben der Methode getColumnClass! z.B.:
Code:
      public Class getColumnClass( int i ) {
        switch ( i ) {
          case X : return Color.class;
          default: return String.class;
        }
      }
 

T1M

Bekanntes Mitglied
Sry, aber ich checks net.
bei
Code:
case X : return Color.class;
was soll da für 'X' hin? doch wohl was vom actionlistener, oder??? :bahnhof:
 

Sky

Top Contributor
Nein, die Spalte, für die der Renderer gesetzt werden soll.

Code:
  JTable table = new JTable() {

      public Class getColumnClass( int i ) {
        switch ( i ) {
          case 0 : return Color.class;
          default: return String.class;
        }
      }
    };

So würde für Spalte 0 der Renderer angewendet
 

T1M

Bekanntes Mitglied
habs mal mit 0 und dann mit 1 versucht. es wurde trotzdem jedesmal "ava.awt.Color[r=255,g=0,b=0]" in die zelle rein.
dann wollt ich mit table.getRowCount() und table.getColumnCount() die anzahl der spalten und zeilen auslesen und dann bei case einsetzen, aber des mag er ned ... edit: hab die türlich in ne int gepackt.
[schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]damn, wird zeit fürs wochenende!!![/schild]
 

T1M

Bekanntes Mitglied
Hi,
hoffe es kann mir noch wer auf den letzten metern helfen. Per Button soll der Hintergrund einer Zeile zur Laufzeit veränderbar sein.

mein Renderer:
Code:
class ColorTableCellRenderer extends DefaultTableCellRenderer
{

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

	    Color color = ( Color )value;
	    this.setBackground( color );


	    setText( color == null ? "" : color.getRed() + ", " + color.getBlue() + ", "
	    		+ color.getGreen() );

	    return this;
	  }
}

Der Button:
Code:
        //makiertes Zeile wird rot
       
       z_rot.addActionListener( new ActionListener() {
            public void actionPerformed( ActionEvent e ) {
                row = table.getSelectedRow();
                column = table.getSelectedColumn();
                table.setValueAt( Color.red, row, column );
              }
            } );

Übergabe:
Code:
		//Hier wird der JTable gesagt, dass Objekte des Types "Color" 
		//vom "ColorTableCellRenderer" dargestellt werden
		table.setDefaultRenderer(Color.class, new ColorTableCellRenderer());

Für die 5 Spalten meiner Tabelle:
Code:
    public Class getColumnClass(int i)
    {
    	a = table.getRowCount();
    	b = table.getColumnCount();
    
    	switch (i)
       	{
       		case 0 : return Color.class;
       		case 1 : return Color.class;
       		case 2 : return Color.class;
       		case 3 : return Color.class;
       		case 4 : return Color.class;
       		default: return String.class;
        }
      }


THX nochmal!!!!
T1M
 

Sky

Top Contributor
T1M hat gesagt.:
Für die 5 Spalten meiner Tabelle:
Code:
    public Class getColumnClass(int i)
    {
    	a = table.getRowCount();
    	b = table.getColumnCount();
    
    	switch (i)
       	{
       		case 0 : return Color.class;
       		case 1 : return Color.class;
       		case 2 : return Color.class;
       		case 3 : return Color.class;
       		case 4 : return Color.class;
       		default: return String.class;
        }
      }


THX nochmal!!!!
T1M
In welcher Klasse befindet sich diese Methode??
 

T1M

Bekanntes Mitglied
Code:
public class Tafel extends JFrame
implements ActionListener
{
 ...
public Class getColumnClass(int i)
    { 
        ...
    }

public Tafel()
    {
    ...
    }

public static void main(String[] args)
    {
     ...
    }
}

So schaut des aus. Lässt dich auch prima compilieren. allerdings schreibt er nach wie vor "java.awt.Color[r=255,g=0,b=0]" is die Zellen rein...
Danke,
T1M
 

T1M

Bekanntes Mitglied
Code:
public class Tafel extends JFrame
implements ActionListener
{
 ...
 public JTable table;
...

  String[] columnNames = {"First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};
    Object[][] data =
    {
    		{
    			"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)
    		},
			{
    			"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)
			},
			{
				"Kathy", "Walrath", "Knitting", new Integer(2), new Boolean(false)
			}
     };


   public Tafel()
   {
         ...                               //GridBagLayout
         //panel_table             //Das Panel wo die Tabelle reinkommt         
        gbc.weighty=100;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        panel_table = new JPanel();
        panel_table.setLayout(new GridBagLayout());
        panel_table.setBorder(BorderFactory.createTitledBorder("Tabelle"));
        add(panel_table, gbc, 0, 1, 3, 1);
        panel_table.setMaximumSize(new Dimension(1200,400));
        panel_table.setMinimumSize(new Dimension(1200,400));
        panel_table.setPreferredSize(new Dimension(1200,400));
       

         //panel_table füllen
        gbc.weightx = 100;
        gbc.weighty =100;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTH;
        table = new JTable(data, columnNames);
        add(table, panel_table, gbc, 0, 0, 1, 1);


         //JScrollPane hinzufügen
        JScrollPane jscroll = new JScrollPane(table);
        gbc.anchor = GridBagConstraints.NORTH;
        add(jscroll, panel_table, gbc, 1, 0, 1, 1);
        jscroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jscroll.setMinimumSize(new Dimension(0, 100));
   }
}

Hoffe das hilft weiter. programmier noch net so lang in java ... :?
 

Sky

Top Contributor
ok... die Methode getColumnClass muss die getColumnClass-Methode der JTable überschreiben. Das geht entweder in einer neuen Klasse "... extends JTable" oder so ( bezogen auf Zeile 48 ) :

Code:
    table = new JTable( data, columnNames ) {
      public Class getColumnClass( int i ) {
        switch( i ) {
          case 0: return Color.class;
          case 1: return Color.class;
          case 2: return Color.class;
          case 3: return Color.class;
          case 4: return Color.class;
          default: return String.class;
        }
      }
    };

Die Variablen a und b habe ich aus der Methode entfernt, weil mir der Sinn nicht klar war. Bei Bedarf kannste die ja wieder einfügen.
 

T1M

Bekanntes Mitglied
Hey, thx für die schnelle hilfe!
habs mit ner neuen klasse versucht, hat aber nüx gebracht. hab dann deinen code kopiert. allerdings will java den nicht an der stelle haben, sondern zeigt erst keinen fehler mehr an, wenn das in Tafel() {...} drin steht. hat aber auch nix geholfen.
ich dreh echt noch am rad! :autsch:
 

Sky

Top Contributor
Ersetze in deinem Code (vom 30. 05. 2005, 10:23) die Zeile 48 durch meinen Code (vom 30. 05. 2005, 10:29) dann sollte es laufen!
 

T1M

Bekanntes Mitglied
Jo, oki.
allerdings erscheint jetzt ein leeres fenster, welches aber nicht leer ist. wenn ich an die stellen klicke wo die buttons und die menuleiste sind, erseinen die plötzlich. die tabelle ist aber weiterhin nicht sichtbar.
das rot einfärben fuktioniert, aber nur für eine zelle, nicht die ganze zeile. man sieht dann eine zelle mit rotem hintergrund.
äußerts seltsam das alles!!! ???:L
aber auf jeden fall vielen dank für deine hilfe!!!
T1M


edit: und ich seh gerad das ich ne fehlermeldung bekomme ...

java.lang.ClassCastException
at ColorTableCellRenderer.getTableCellRendererComponent(ColorTableCellRenderer.java:32)
... //ewig lang ...

bezieht sich darauf:
Code:
import javax.swing.table.*;
import java.awt.*;
import java.awt.Color;

import javax.swing.*;


class ColorTableCellRenderer extends DefaultTableCellRenderer
{

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

	    Color color = ( Color )value;
	    this.setBackground( color );


	    setText( color == null ? "" : color.getRed() + ", " + color.getBlue() + ", "
	    		+ color.getGreen() );

	    return this;
	  }
	
	  	  
	public static void main(String[] args)
	{
		
	}
}
 

Sky

Top Contributor
T1M hat gesagt.:
allerdings erscheint jetzt ein leeres fenster, welches aber nicht leer ist. wenn ich an die stellen klicke wo die buttons und die menuleiste sind, erseinen die plötzlich. die tabelle ist aber weiterhin nicht sichtbar.
Wie kannst Du dann das rot einfärben testen??

T1M hat gesagt.:
das rot einfärben fuktioniert, aber nur für eine zelle, nicht die ganze zeile. man sieht dann eine zelle mit rotem hintergrund.
Wieso ist das seltsam? Dein Buttonklick setzt den Wert für nur eine Zelle und nicht für alle Zellen der Zeile!!!
 

T1M

Bekanntes Mitglied
also, wenn ich dahinklicke wo die tabelle sein sollte und dann auf den platz wo der button sein sollte (der ja dann auch erseint) dann färbt sich eine zelle rot.
und wegen der zelle, bzw. zeile. ich hatte es anfang mit
Code:
table.setSelectionBackground(Color.RED);
versucht. da wurde immer die ganze zeile rot gefärbt. allerdings immer die aktuell selektierte. von daher wars unbrauchbar.
P.s.: *räusper* in meinem vorherigen post hab ich noch dazugefügt ... :shock:
des bezieht sich auf zeile 19:
Code:
	    Color color = ( Color )value;
 

T1M

Bekanntes Mitglied
Hi,
ich bekomme ne ClassCastException.
also, wenn ich bei:
Code:
        table = new JTable(data, columnNames)
		{
	     public Class getColumnClass(int i)
	     {

	     	switch (i)
			{
				case 0: return Color.class;
				case 1: return Color.class;
				case 2: return Color.class;
				case 3: return Color.class;
				case 4: return Color.class;
				default: return String.class;
			}
	     }
	   };
'int i' durch 'char i' ersetze, dann wird mir das fenster mit allen inhalten angezeigt und es gibt keine fehlermeldung. allerdings funktioniert dann das setzen der Hintergrundfarbe nicht mehr. mit 'int i' is aber das ganze fenster grau und die buttons erschenen erst nach dem draufklicken (bleiben dann aber auch sichtbar). die tabelle bleibt unsichtbar, bis auf die eingefärbten zellen. ???:L
habs auch schon mit Integer.parseInt(i) versucht, doch auch das klappt net.

THX anyway,
T1M
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
Developer_X Java JTable - Combobox + Checkbox - Cellrenderer + Editor AWT, Swing, JavaFX & SWT 3
S Verständnisproblem mit CellRenderer AWT, Swing, JavaFX & SWT 1
M Swing Jtable CellRenderer Parameter uebergeben AWT, Swing, JavaFX & SWT 4
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
J JTable: Problem bei CellRenderer AWT, Swing, JavaFX & SWT 3
S Swing Zelle einer JTable hervorheben (ohne CellRenderer) AWT, Swing, JavaFX & SWT 3
Spin CellRenderer Probleme bei JList AWT, Swing, JavaFX & SWT 4
S Swing Jlist - CellRenderer/ Selektion AWT, Swing, JavaFX & SWT 2
B JTable CellRenderer AWT, Swing, JavaFX & SWT 5
D Swing JList, CellRenderer und Model AWT, Swing, JavaFX & SWT 6
C Wieso funktionert der CellRenderer nicht? AWT, Swing, JavaFX & SWT 2
J CellRenderer einzelne zellen Hintergrund AWT, Swing, JavaFX & SWT 9
hdi Swing JTable: Mein CellRenderer ist ein Performance-Killer? AWT, Swing, JavaFX & SWT 7
E Swing JTable mit CellRenderer AWT, Swing, JavaFX & SWT 7
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
J JList CellRenderer Null-Layoutpanel AWT, Swing, JavaFX & SWT 4
? Tabelle formatieren - auch ohne CellRenderer? AWT, Swing, JavaFX & SWT 6
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
H JTable und CellRenderer AWT, Swing, JavaFX & SWT 2
M CellRenderer in JTable AWT, Swing, JavaFX & SWT 11
D JList Cellrenderer fügt mehrfach ein AWT, Swing, JavaFX & SWT 2
G JTable, TableModel und CellRenderer AWT, Swing, JavaFX & SWT 3
K Verständnisfrage zum CellRenderer AWT, Swing, JavaFX & SWT 4
G [Problem] CellRenderer und ActionCommand AWT, Swing, JavaFX & SWT 5
K JTable - warum funktioniert mein CellRenderer nicht? AWT, Swing, JavaFX & SWT 9
G CellRenderer, der einige ImageIcons aneinanderreiht AWT, Swing, JavaFX & SWT 5
G JTable: Zellenhöhe mit neuem CellRenderer & Editor AWT, Swing, JavaFX & SWT 17
G CellRenderer funkt net AWT, Swing, JavaFX & SWT 5
F JTable CellRenderer über boolean AWT, Swing, JavaFX & SWT 12
M Krieg keine CellRenderer Methode hin :( AWT, Swing, JavaFX & SWT 12
C JTable mit JPanel als CellRenderer AWT, Swing, JavaFX & SWT 2
G JTable CellRenderer-Problem AWT, Swing, JavaFX & SWT 4
M JTabbedPane -> setSelectedIndex funzt nicht AWT, Swing, JavaFX & SWT 3
X JScrollPane funzt net... AWT, Swing, JavaFX & SWT 5
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
R Swing Methode add([Component]) funzt nich AWT, Swing, JavaFX & SWT 7
A Nimbus eigener Painter funzt nicht AWT, Swing, JavaFX & SWT 11
G JTree TreeCellRenderer Panelgröße funzt net AWT, Swing, JavaFX & SWT 2
O JPanel.setEnabled(false); auf Kindelemente funzt net? AWT, Swing, JavaFX & SWT 6
G textarea.read funzt net in Jar-Datei AWT, Swing, JavaFX & SWT 7
G SWT DatePicker funzt nicht in eigener Anwendung AWT, Swing, JavaFX & SWT 5
A simples programm funzt net AWT, Swing, JavaFX & SWT 7
K Scrollbar funzt net :-/ AWT, Swing, JavaFX & SWT 4
S ComponentListener funzt nicht AWT, Swing, JavaFX & SWT 3
K setResizable() funzt nich AWT, Swing, JavaFX & SWT 3
J Window Listener funzt nicht richtig AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben