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?
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…
A JTable implementa Scrollable. Você pode sobrescrever os métodos dessa interface para customizar o comportamento do seu scroll.
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.
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. */
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.
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.