RowSorter + tableModel

1 resposta
A

Srs.

tenho uma tabela com algumas células em diferentes colunas coloridas (passo um array para o model) devido a algumas pré-condições (o usuário pode modificar a cor de fundo da célula como ele quiser). Até aí beleza. Quando mostro, fica OK.

O problema, é que como uso RowSorter, ou filtro algo, as cores das células de antes ficam na mesma posição (com a célula contendo algo diferente…). Isso por que como passo uma array, esta array é estática, e não acompanha a mudança a todo RowSorter executado. O tableModel funciona corretamente, ele está mostrando as células coloridas que estou pedindo… Mas, quando aplico o RowSorter, ele bagunça tudo.

Como resolvo isso ? Será que a cada click no rowsorter devo re-arranjar minha array ??

Att,
André

1 Resposta

Eder_Peixoto

Olá André!

O JTable é dividido em três camadas, sendo duas de interesse especial para resolver seu problema.

Camada View: responsável por apresentar os dados em cada célula. Utiliza-se de renderizadores e editores. O primeiro é responsável por mostrar num componente o conteúdo que está armazenado na camada Model (que comentarei a seguir). O segundo é responsável por apresentar um componente que permitirá ao usuário interagir com uma determinada célula (quando sua tabela permite edição).

Camada Model: responsável por armazenar os dados e configurações que possam ser necessárias. As classes principais são DefaultTableModel (uma instância de TableModel), RowSorter e RowFilter.
Na primeira classe é onde ficam armazenados os objetos que serão manipulados pelo renderizador e/ou editor da camada View.
RowSorter é utilizado para ordenar os dados apresentados ao usuário. Algo importante aqui, é notar que a ordenação é realizada apenas na camada View, sendo que na Model os objetos continuam inalteráveis.
RowFilter é utilizado para filtrar os dados que a camada Model envia à View.

Aplicando então os conceitos no teu problema, e considerando que o usuário pode alterar a cor de células específicas, então:

  1. Os dados que serão apresentados ao usuário ficam dentro de um objeto;
  2. As cores que são apresentadas em cada célula devem ficar dentro desse mesmo objeto (especificado no item 1);
  3. Na camada View você terá um Renderizador que apresentará os dados, e que também levará em consideração a cor a ser apresentada na célula;
  4. Como o usuário pode alterar a cor, então é necessário um Editor, que será responsável por interagir com o usuário na mudança dos dados e das cores. Os dados e cores alterados pelo usuário terão que ser registrados na camada Model, para permitir a correta apresentação pelo Renderizador;
  5. Acredito que o teu RowSorter levará apenas em consideração os dados armazenados na camada Model;
  6. O mesmo é válido para o RowFilter, que deve filtrar os dados levando em consideração a camada Model;
  7. Caso o RowSorter ou o RowFilter devam considerar a cor, note que essa informação também está contida no objeto que contém os dados;
  8. Para fins de clareza, seus dados e a cor devem ficar em objetos distintos, mas encapsulados num mesmo objeto.

Bom André: não sei se entendi bem o seu problema, e muito menos se te ajudei ou compliquei ainda mais, mas acho que pode ser um início para resolvê-lo. Qualquer dúvida, que é muito provável que surja, poste que tentaremos te ajudar.

Abraços

Criado 31 de julho de 2009
Ultima resposta 31 de jul. de 2009
Respostas 1
Participantes 2