Rolar JScrollPane da JTable Automaticamente (RESOLVIDO)

Olá a todos, estou desenvolvendo um componente swing chamado LookupComboBox. Ele é um combobox, porém ao invés de uma lista, ele possui uma tabela para apresentar os dados.

Para incromentar o componente, fiz também uma classe que controla o que é digitado quando o componente é editável, assim a medida que o valor é digitado, ele já é buscado na tabela, mas é ai que estou com problemas: se eu efetuo a pesquisa por um valor que não está visível na tela, ele é selecionado sem problemas, porém a barra de rolagem não “rola” até o item.

Como faço para que ocorra tal rolagem?
Alguém possui alguma sugestão?

Desde já agradeço a ajuda de todos.

Você tem duas alternativas.

  1. A JTable implementa Scrollable. Você pode sobrescrever os métodos dessa interface para customizar o comportamento do seu scroll.

  2. Você pode usar os comandos:
    scrollPane.getVerticalScrollBar().setMaximum(tamanhoDaTabela);
    scrollPane.getVerticalScrollBar().setValue(linhaDesejada);

manow,

abaixo segue o link de um componente, que é uma jcombobox editavel, e que a medida q vc vai digitando ela vai trazendo as ocorrências e ja rola automaticamente, do jeito q vc quer… e o fera é que usa pesquisa binaria, funciona pra ate 10.000 items sem dar ‘lag’… ai vc adapta ela pra usar table inves de list…


http://www.java2s.com/Code/Java/Swing-Components/JComboBoxaddingautomaticcompletionBinayLookup2.htm

:wink:

[quote=ViniGodoy]Você tem duas alternativas.

  1. A JTable implementa Scrollable. Você pode sobrescrever os métodos dessa interface para customizar o comportamento do seu scroll.

  2. Você pode usar os comandos:
    scrollPane.getVerticalScrollBar().setMaximum(tamanhoDaTabela);
    scrollPane.getVerticalScrollBar().setValue(linhaDesejada);
    [/quote]

Você teria algum exemplo de como posso fazer isto implementado Scrollable? Acho que esta solução se encaixaria melhor para mim. Qual dos métodos eu devo implementar para que ocorra a rolagem automática?

Irei explicar melhor o problema, para que mais pessoas possam ajudar: eu digito um valor em um campo e ele pesquisa na minha JTable, selecionando a linha que se encontra o objeto, porém quando a linha selecionada não está visível, a barra de rolagem não rola automaticamente.

Como fazer para que a barra de rolagem “acompanhe” a seleção das linhas da JTable?

Olha, eu entendi seu problema pq já tive um parecido, mas não sei se te ajuda. Veja bem, no meu caso eu tinha diversos componentes dentro de um panel que estava dentro de um scrollpane, e ai o que acontecia é que as vezes eu jogava o foco pra um componente que não estava visível no scroll, então eu tinha que rolar o scroll pra que o componente ficasse visível na tela. Vou colocar o trecho do código de como fiz isso, tomara que ajude:

JScrollPane scroll = (JScrollPane)pai;
Component   panel  = scroll.getViewport().getComponent(0);
				
if (panel instanceof JPanel){
	Point p = new Point((int) scroll.getViewport().getViewPosition().getX(), (int) c.getLocation().getY());
	scroll.getViewport().setViewPosition(p);
}

No meu caso eu uso pra diferentes telas, então eu pego o JScrollPane e o JPanel dentro dele em tempo de execução. Ah, e o objeto que chamdo de “c” é na verdade meu componente, como eu tinha mencionado, o componente que eu quero que fique visível. No meu caso ele era um combo, um textfield, check, etc, qq componente que pudesse estar dentro do JPanel.

T+, :wink:

Alguém possui mais alguma sugestão?
Nenhuma das apresentadas funcionou :frowning:

Problema solucionado…
Bastou adicionar o ouvinte de eventos de seleção à tabela…

Solução:

        /* Configura o evento de seleção na tabela, para atualizar o scroll. */
        ListSelectionModel selectionModel = table.getSelectionModel();
        selectionModel.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent event) {
                table.scrollRectToVisible(table.getCellRect(
                        table.getSelectedRow(), 0, true));
            } /* Finaliza o método valueChanged. */
        }); /* Finaliza a classe interna abstrata ListSelectionListener. */

ola pessoal,

tenho um problema…tenho uma JTable dentro de uma JScrollPane.
Queria saber como faço pra a cada linha inserida a barra de rolagem ir descendo ???

Muito Obrigado

Ricardo

ola pessoal,

utilizei o jScrollPane1.getVerticalScrollBar().setValue(table.getHeight()); e funcionou, mas esta mostrando até o penúltimo…o último ainda tem q descer com a barra de rolagem.

Alguém sabe oq posso fazer ???

Ricardo

Nossa, essa solução do Ricardo de 2007 veio a calhar! Me quebrou um galhão hoje!! Tanto tempo depois…

to ficando viciado nesse swing!

Abraços.

[quote=ricardo13]ola pessoal,

utilizei o jScrollPane1.getVerticalScrollBar().setValue(table.getHeight()); e funcionou, mas esta mostrando até o penúltimo…o último ainda tem q descer com a barra de rolagem.

Alguém sabe oq posso fazer ???

Ricardo[/quote]
Cheguei a este tópico pelo Google, como os códigos postados aqui não funcionou segue um exemplo funcional que rola até a ultima linha criando um JScroll temporário.

private void rolarScroll() {
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			JScrollBar temp = getMeuScroll().getVerticalScrollBar();
			temp.setValue(temp.getMaximum());
		}
	});
}

Para utilizar basta invocar o método rolarScroll() após adicionar uma nova linha na JTable ou similar.

Att,

Outra opção é usar essa classe aqui, de um tópico igualmente antigo:
http://www.guj.com.br/java/88656-movimentar-jtable#474184