Hintergrundfarbe von CheckBoxen in einer JTable

Status
Nicht offen für weitere Antworten.

Jens81

Gesperrter Benutzer
Hallo zusammen,

ich habe eine JTable die (zum testen) aus 4 Spalten und 2 Zeilen besteht. In der ersten Spalte stehen Strings, in den restlichen Spalten boolean-Werte die als Checkboxen gerendert werden.

Nun möchte ich die Farben der Zellen ändern, in denen die Checkboxen stehen. Die String-Felder stellen kein Problem dar.

Mein TableModel:
Java:
	private class UebersichtTableModel extends DefaultTableModel {
		private static final long serialVersionUID = -2901586710535614349L;

		public UebersichtTableModel(String[] spaltentitel, int i) {
			super(spaltentitel, i);
		}
		
		public Class getColumnClass(int columnIndex) {
			if (columnIndex > 0)
				return Boolean.class;
			else
				return String.class;
		}
		
		public boolean isCellEditable(int row, int col) {
			return false;
		}
	}

Mein Renderer:
Java:
	private class UebersichtTableCellRenderer extends DefaultTableCellRenderer {
		static final long serialVersionUID = -7684107825328207439L;

		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
	        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
	        
	        if (row == 0)
	        	setBackground(Color.GREEN);
	        if (row == 1)
	        	setBackground(Color.RED);
	        
	        return this;
		}
	}

So sollten beispielsweise Zeile 1 grün und Zeile 2 rot dargestellt werden. Es klappt aber nur mit der "String-Spalte", nicht mit den Checkboxen... was mache ich falsch?

Danke und Gruß,
Jens
 
DefaultTableCellRenderer erbt von JLabel, der kann kaum für die Darstellung von JCheckBoxen dienen,
wie setzt du den denn in der JTable, was veranlasst dich zu glauben, dass er eingesetzt wird?

wahrscheinlich brauchst du einen speziellen Renderer, JTable hat als Default
Java:
    static class BooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource
    {
        private static final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

	public BooleanRenderer() {
	    super();
	    setHorizontalAlignment(JLabel.CENTER);
            setBorderPainted(true);
	}

        public Component getTableCellRendererComponent(JTable table, Object value,
						       boolean isSelected, boolean hasFocus, int row, int column) {
	    if (isSelected) {
	        setForeground(table.getSelectionForeground());
	        super.setBackground(table.getSelectionBackground());
	    }
	    else {
	        setForeground(table.getForeground());
	        setBackground(table.getBackground());
	    }
            setSelected((value != null && ((Boolean)value).booleanValue()));

            if (hasFocus) {
                setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
            } else {
                setBorder(noFocusBorder);
            }

            return this;
        }
    }
und den musst du für die Boolean.class registrieren
 
Gesetzt habe ich den Renderer über
Java:
table_uebersicht.setDefaultRenderer(Boolean.class, new BooleanRenderer());

Danke für deine Hilfe, hab's jetzt so wie ich es mir vorgestellt habe.

Eine Frage habe ich aber noch: Kann man einem TableModel auch mehrere Renderer zuweisen, beispielsweise einen für Boolean, einen für Strings, usw.?
 
falls du 'einer Table' statt 'einem TableModel' meinst:

ist aus
setDefaultRenderer(Boolean.class, ..)
nicht erkennbar, dass für String was anderes gesetzt werden kann?
 
Ja ich meinte TableModel.

Hab mich halt gefragt, ob der zuvor gesetzte Renderer ersetzt wird - was dann wohl nicht passiert... Danke
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben