Estou desenvolvendo uma aplicação que vai adicionando linhas em uma JTable e fazendo um “scrolling” automático: Segue trecho do código:
tabelaDeItensModel.adicionaItem(item);
jScrollPaneItens.getVerticalScrollBar()
.setValue(jScrollPaneItens.getVerticalScrollBar()
.getMaximum());
Durante os testes verifiquei que a execução rolava a tabela apenas até o penúltimo item e não até o último (que acabou de ser inserido).
Então resolvi fazer alguns testes a mais para descobrir o porque e fiz o seguinte:
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
tabelaDeItensModel.adicionaItem(item);
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
Para minha surpresa a altura da tabela não alterou após a inserção de um item mesmo a aplicação tendo exibido a tabela com o novo item.
- Valor do 1º JOptionPane: 0
- Valor do 2º JOptionPane: 0
Então fiz mais um teste: adicionei um novo JOptionPane após o segundo:
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
tabelaDeItensModel.adicionaItem(item);
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
Para minha surpresa maior ainda no terceiro JOptionPane a altura da tabela estava atualizada (diferente dos dois anteriores)
- Valor do 1º JOptionPane: 0
- Valor do 2º JOptionPane: 0
- Valor do 3º JOptionPane: 16
Então deduzi que o sistema estava executando o “scrolling” antes da atualização de renderização da tabela e o tempo que eu demoro para clicar no “ok” do 2º JOptionPane é suficiente para atualizar o tamanho da JTable e mostrar corretamente no 3º JOptionPane.
Então fiz mais um teste:
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
int temp = jTableItensDaVenda.getHeight();
tabelaDeItensModel.adicionaItem(item);
while (jTableItensDaVenda.getHeight() <= temp) { }
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(),"Erro!",
JOptionPane.ERROR_MESSAGE);
Nessa caso a aplicação exibiu o 1º JOptionPane e entrou em loop infinito. Então fiz ainda mais um teste: Acrescentei um JOptionPane dentro do WHILE:
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
int temp = jTableItensDaVenda.getHeight();
tabelaDeItensModel.adicionaItem(item);
while (jTableItensDaVenda.getHeight() <= temp) {
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(), "Erro!",
JOptionPane.ERROR_MESSAGE);
}
JOptionPane.showMessageDialog(null, jTableItensDaVenda.getHeight(),"Erro!",
JOptionPane.ERROR_MESSAGE);
Aí fiquei mais surpreso ainda com o resultado:
- Valor do 1º JOptionPane: 0
- Valor do 2º JOptionPane (dentro do while e executado uma única vez): 0
- Valor do 3º JOptionPane: 16
Por favor, alguém poderia me explicar para que eu possa pensar em uma solução para meu “scrolling” automático?