DefaultTableCellRenderer blendet JCheckBox aus

Foermchen82

Top Contributor
Hallo zusammen,

ich hab eine JTable und im Model alles so konfiguriert, dass in einer Spalte eine Boolean wert angezeigt wird. Per Default wird das ja al Checkbox dargestellt. Passt auch soweit.

Jetzt habe ich aber noch einen DefaultTableCellRenderer dran gehangen um Vorder- und Hintergründe zu setzen. Jetzt steht aber auf einmal in der entsprechenden Spalt "false".

Was ist flasch an meinem Renderer??:

Java:
@Override
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
		this.setForeground(null);
		this.setBackground(null);
		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		int modelCol = table.convertColumnIndexToModel(column);
		int modelRow = table.convertRowIndexToModel(row);
		
		formatBackground(modelCol, modelRow, row, isSelected);
		formatForeground(modelCol, modelRow);
		return this;
	}
	
	private void formatBackground(int modelCol, int modelRow, int viewRow, boolean isSelected) {
		setBackground(isSelected ? SystemColor.textHighlight : viewRow % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
	}
	
	private void formatForeground(int modelCol, int modelRow){
		setForeground(Color.GRAY);		
	}

PS: Die Methodenlogik hab ich gekürzt, da nichts UI-Relevante drin stand, sondern nur dinge wie: Wenn wert gleich X nehme Farbe Y"
 
Du gibst doch gar keine Checkbox zurück, sondern ständig den selben CellRenderer. dieses
Code:
return this
in zeile 11 sollte wohl angepasst werden, damit du etwas vernünftiges zurücklieferst
 
Der DefaultTableCellRenderer ist von JLabel abgeleitet und wird daher immer nur Strings anzeigen, wenn
Code:
this
zurückgeliefert wird..

Erstelle dir einen eigenen Renderer der von einer Checkbox abgeleitet ist und verwende den.
 
Hallo Foermchen,

für so was brauchen wir keinen Renderer. Einfach JTable#prepareRenderer überschreiben. Hier ist ein Beispiel:

Java:
table = new JTable() {

    @Override
    public Component prepareRenderer(
            TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        c.setBackground(isRowSelected(row) ? SystemColor.textHighlight
                : row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        c.setForeground(Color.GRAY);
        return c;
    }
};

Gruß,
André
 
Hallo Foermchen,

für so was brauchen wir keinen Renderer. Einfach JTable#prepareRenderer überschreiben. Hier ist ein Beispiel:

Java:
table = new JTable() {

    @Override
    public Component prepareRenderer(
            TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        c.setBackground(isRowSelected(row) ? SystemColor.textHighlight
                : row % 2 == 0 ? Color.LIGHT_GRAY : Color.WHITE);
        c.setForeground(Color.GRAY);
        return c;
    }
};

Gruß,
André

Hey super, das ist doch mal ne Idee. Danke
 

Neue Themen


Zurück
Oben