Formatar data (LocalDate) na JTable sem mudar o tipo

Olá pessoal!

Eu tenho uma JTable que tem um modelo que extende da classe AbstractTableModel, onde eu sobrescrevo o método getColumnClass passando o tipo LocalDate para a coluna de data, isso para poder fazer a ordenação por data, por que se o tipo fosse String não daria para ordenar clicando na coluna. Enfim preciso exibir a data no formato mm/dd/yyyy mas sem mudar o seu tipo, acredito que seja possível e até ideal.

Desde já agradeço.

OBS.: Eu sei como formatar datas passando para String.

@Override
    public Class<?> getColumnClass(int coluna) {
        switch (coluna) {
            case COLUNA_DATA:
                return LocalDate.class;
            case COLUNA_DIA_DA_SEMANA:
                return DayOfWeek.class;
            default:
                return String.class;
        }
    }

@Override
    public Object getValueAt(int linha, int coluna) {
        switch (coluna) {
            // codigo omitido
            case COLUNA_DATA:
                return apontamentos.get(linha).getData();
            case COLUNA_DIA_DA_SEMANA:
                    return apontamentos
                            .get(linha)
                            .getData()
                            .getDayOfWeek();
            // codigo omitido
        return null;
    }

image

Uma possibilidade é usar o setCellRenderer na sua tabela com um renderer personalizado. Nele você pode alterar a formatação apenas visualmente, dessa forma ao obter o valor da célula pelo model não haverá nenhuma alteração de tipo ou valor. Exemplo:

public final class TableCellRender extends DefaultTableCellRenderer{

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

		if (c instanceof JLabel){
			final JLabel lbl = (JLabel) c; 

			if (value instanceof LocalDateTime)
				lbl.setText(/* Sua formatação aqui */);

			else if (value instanceof LocalDate)
				lbl.setText(/* Sua formatação aqui */);

			else if (value instanceof LocalTime)
				lbl.setText(/* Sua formatação aqui */);
		}

		return c;
	} 
}

Docs:

TableCellRenderer

DefaultTableCellRenderer

Tópico auxiliar

1 curtida

Outra possibilidade é usar um TableRowSorter personalizado, aí você pode deixar a coluna como String mas implementar a ordenação pela data.
Exemplo aqui.

1 curtida