Ordenar de acordo com a data JavaFX

Olá pessoal…

É minha primeira postagem, e não faço ideia se a coloquei no local correto.
Estou com um pequeno problema. Tenho uma TableColumn que exibe uma Data formatada para o padrão “dd/MM/yyyy”. Digo formatado, porque no banco ela está salva como LocalDate(“yyyy/MM/dd”).

A função de ordenar a coluna está habilitada e eu já carrego a TableView com uma lista ordenada pela data que vem do banco de dados. Porém quando vou ordenar ela pela coluna, ela usa as Strings no padrão BR e ordena a lista do jeito errado.

Resumindo…

Recebo do banco assim:
2019-01-02
2019-01-15
2019-02-12

É exibido no padrão BR:
02/01/2019
15/01/2019
12/02/2019

E quando reordeno a coluna usa o padrão BR e fica assim:
02/01/2019
12/02/2019
15/01/2019

Há alguma maneira de exibir as no padrão BR e ordenar da maneira correta?

Você pode usar o comparator antes de popular o TableView

        LocalDate data1 = LocalDate.of(2019, 1, 10);
	LocalDate data2 = LocalDate.of(2019, 2, 12);
	LocalDate data3 = LocalDate.of(2019, 1, 15);
	
	ObservableList<LocalDate> observable = FXCollections
			.observableArrayList(data1,data2,data3);
	
	Comparator<LocalDate> comparatorMes = (o1, o2) -> {
		if(o1.isAfter(o2)) {
			return 1;
		}else if (o1.isBefore(o2)) {
			return -1;
		}else {
			return 0;	
		}
	};
			
	observable.sort(comparatorMes);
1 curtida

Bom dia Eduardo…

Eu já faço a comparação antes de popular.

Comparator<Transacao> comp = Comparator.comparing(Transacao::getData);

Onde Transacao é a classe que contem a data pela qual comparo e populo.
Ela vai ordenada do jeito certo. Porém, eu exibo os dados no padrão BR( 01/01/2019) usando uma String formatData.

colunaData.setCellValueFactory(new PropertyValueFactory<Transacao, String>("formatData"));

E quando ordeno clicando na coluna. Ele ordena do jeito errado. Ele usa as String das celulas e não os dados da tabela.

Em aplicações reais normalmente se ordena direto no banco, paginado, pois o volume de informações sempre cresce. Então se o usuário clicou pra ordenar, simplesmente faça um order by no banco. Mas se for um trabalho de escola esquece o que falei.

Entendi. Mas não é um trabalho de escola.

É um programa que para orçamentos.
Penso que se a ferramenta está para ser usada, deve haver alguma maneira de fazer um funcionar.
Se eu mudar para exibir a data no padrão “yyyy/MM/dd”, tudo funcionar perfeitamente.

O que ta pegando, é que eu não achei a maneira de informar a coluna da tabela para usar a data dos dados e não as String exibidas.

Meus queridos… Consegui resolver da seguinte forma.

Eu já havia tentado via Comparator porém não tinha conseguido.
Mas o exemplo do Eduardo me deu outra ideia enquanto eu respondia ao javaflex.

Acabou que resolvi assim.

Comparator<String> comparator = (o1, o2) -> {

			String[] d1 = o1.split("/");
			String[] d2 = o2.split("/");

			int ano1 = Integer.parseInt(d1[2]);
			int mes1 = Integer.parseInt(d1[1]);
			int dia1 = Integer.parseInt(d1[0]);

			int ano2 = Integer.parseInt(d2[2]);
			int mes2 = Integer.parseInt(d2[1]);
			int dia2 = Integer.parseInt(d2[0]);

			LocalDate data1 = LocalDate.of(ano1, mes1, dia1);
			LocalDate data2 = LocalDate.of(ano2, mes2, dia2);

			if (data1.isAfter(data2)) {
				return 1;
			} else if (data1.isBefore(data2)) {
				return -1;
			} else {
				return 0;
			}

		};

colunaData.setComparator(comparator);

Dividi a String em três campos, criei duas datas locais e fiz a comparação.
Assim tenho a data que vem do banco para trabalhar como quiser e consigo exibir ela no padrão BR.
E quando clico na coluna consigo na ordem crescente e decrescente!

Obrigado ao dois!

1 curtida