Background Color einer Zelle in einer JTable ändern

fastfiler

Mitglied
Hi,

ich möchte in einer JTable bzw. bei einer Spalter der JTable bestimmte zellen mit einer anderen hintergrundfarbe belegen bzw. einfärben, wenn es sich nicht um eine integer-zahl handelt oder allg. ausdrückt ein bestimmtes kriterium nicht erfüllt ist. hab mich zu diesem thema bereits hier im forum etwas umgeschaut und in erfahrung gebraucht, dass das mit einem CellRenderer geht. Jedoch habe ich absolut keine ahnung wie ich das angehen soll.

hat zufällig jmd. sowas ähnliches schon mal gemacht bzw. hat einen link (ausser die javadoc) der das problem aufgreift und genauer beschreibt bzw. eine lösung für meins anbietet.

mfg & thx

fasti
 
hi habs hinbekommen, nur funktioniert es an der stelle, an der ich es gerne hätte nicht und erhalte folgende Exception "java.lang.ClassCastException: java.lang.Integer" .
Wenn ich den code unten ausführe passiert genau das was ich will. hat jmd eine vorstellung an was das liegen kann?

mfg & thx

Code:
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class NewClass extends JFrame {

	public NewClass() {
		super("test");
		JTable tb = new JTable();

		Object[][] data = new Object[][] { { "1", "deb1", "RE", "BLAB",
				"sdaföj", "föasfj", "föasfj", "asdöfj", "Ddllkl", "0" } };
		Object[] header = new Object[] { "1", "2", "3", "4", "5", "6", "7",
				"8", "9", "10" };

		tb.setModel(new DefaultTableModel(data, header));

		tb.setDefaultRenderer(Object.class, new ColoredTableCellRenderer());

		getContentPane().add(tb);
		setSize(350, 200);
		setVisible(true);
	}

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

##############

Code:
/*
 * NewClass.java
 *
 * Created on 19. November 2005, 23:03
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */



/**
 *
 * @author fasti
 */
/* ColoredTableCellRenderer.java */

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class ColoredTableCellRenderer
        implements TableCellRenderer {
    private Color lightBlue = new Color(160, 160, 255);
    private Color darkBlue  = new Color( 64,  64, 128);
    
    public Component getTableCellRendererComponent(
            JTable table,
            Object value,
            boolean isSelected,
            boolean hasFocus,
            int row,
            int column
            ) {
        //Label erzeugen
        JLabel label = new JLabel((String)value);
        label.setOpaque(true);
        Border b = BorderFactory.createEmptyBorder(1, 1, 1, 1);
        label.setBorder(b);
        label.setFont(table.getFont());
        label.setForeground(table.getForeground());
        label.setBackground(table.getBackground());
        if (hasFocus) {
            label.setBackground(darkBlue);
            label.setForeground(Color.white);
        } else if (isSelected) {
            label.setBackground(lightBlue);
        } else {
            //Angezeigte Spalte in Modellspalte umwandeln
            column = table.convertColumnIndexToModel(column);
            if (column == 9) {
                boolean numpages = Boolean.parseBoolean((String)value);
                if (numpages == true) {
                    label.setBackground(Color.red);
                } else if (numpages == false) {
                    label.setBackground(Color.orange);
                }
            }
        }
        return label;
    }
}
 
Hi,
ich hab ein "neues" Problem mit meinem CustomTableCellRenderer. Es geht um Schiffe versenken... Ich möchte die Zellen, in denen sich der Teil eines Schiffes befindet, einfärben.
Ich hab mich jetzt soweit mit dem CustomTableCellRenderer befasst, dass ich glaube, ihn verstanden zu haben. Mein Ansatz ist nun, in die Schiff-Zellen einen bestimmten Wert (z.B. "s") zu schreiben und über den CustomTableCellRenderer diejenigen Zellen einzufärben, die eben ein "s" enthalten.
Um Schiffe zu platzieren merke ich mir die zuerst und die zuletzt angeklickten Zellen und setze alle Zellen von der ersten bis zur letzten auf "s". Beim jeweils ersten Mal klappt das auch. Wenn ich dann allerdings irgendwoanders in die JTable klicke, wir der eingefärbte Bereich bis zu dieser Zelle erweitert, obwohl da überhaupt keine "s" drin stehen. Wenn ich das Fenster minimiere und wieder maximiere sind jeweils die kompletten Spalten eingefärbt, auch wenn nur in einer Zelle ein "s" steht. Kann mir da jemand sagen, woran das liegt? Das ergibt für mich nämlich überhaupt keinen Sinn.

Danke schonmal!

EDIT: Der Renderer setzt den Hintergrund IMMER auf Blau, selbst wenn ich auf value.equals("d") überprüfe? Ich raffs nicht...!
Edit2: ein "else" für das if(value instance of String) fehlte. /Solved

Code und Screenshot:
Code:
public class CustomTableCellRenderer extends DefaultTableCellRenderer
{
    @Override
    public Component getTableCellRendererComponent
       (JTable table, Object value, boolean isSelected,
       boolean hasFocus, int row, int column)
    {
        Component cell = super.getTableCellRendererComponent
           (table, value, isSelected, hasFocus, row, column);
            try {
                if( value instanceof String ) {
                    
                    if(value.equals("s")) {
                        System.out.println(row + " " + column);
                        cell.setBackground( Color.BLUE );
                        //cell.setForeground(Color.BLUE);
                    }
                    else {
                        cell.setBackground( Color.WHITE );
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        return cell;
    }
}
 

Anhänge

  • 1.JPG
    1.JPG
    32,9 KB · Aufrufe: 629
  • 2.JPG
    2.JPG
    31,7 KB · Aufrufe: 679
Zuletzt bearbeitet:

Neue Beiträge

Zurück