Tenho uma tabela(jtable) que atualiza automaticamente em tempo de execução.
Preciso que a barra de rolagem (jscrollpane) matenha fixo no lugar onde o usuario deixar.
O problema é que toda vez que a tabela atualiza, a barra vai para o topo.
Imagina vc abrir uma tabela com varios nomes, quando estiver com a barra de rolagem bem em baixo e a tabela atualizar, vc irá perder o nome de vista.
Preciso que a barra de rolagem (jscrollpane) matenha fixo no lugar onde o usuario deixar.
OBS: Sem tocar na tabela (linha ou coluna), apenas clicando na barra de rolagem.
Clicando na tabela, o link acima funciona…
Eu fiz um exemplo aqui e a barra já fica onde está:
packageteste;importjavax.swing.JFrame;importjavax.swing.JScrollPane;importjavax.swing.JTable;importjavax.swing.SwingUtilities;importjavax.swing.table.AbstractTableModel;importjavax.swing.table.TableModel;publicclassTesteFrameextendsJFrame{privatestaticintnumLinhas=10;staticclassModelextendsAbstractTableModel{publicintgetColumnCount(){return10;}publicintgetRowCount(){returnnumLinhas;}publicObjectgetValueAt(introw,intcol){returnnewInteger(row*col);}publicvoidadicionarLinha(){numLinhas++;fireTableRowsInserted(numLinhas,numLinhas);}};Modelmodelo=newModel();publicTesteFrame(){setSize(400,200);JTabletable=newJTable(modelo);JScrollPanescrollpane=newJScrollPane(table);add(scrollpane);newThread(newRunnable(){@Overridepublicvoidrun(){while(true){SwingUtilities.invokeLater(newRunnable(){@Overridepublicvoidrun(){modelo.adicionarLinha();}});try{Thread.sleep(2000);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}/** * @param args */publicstaticvoidmain(String[]args){newTesteFrame().setVisible(true);}}
C
carlinhoscomp
Fala Rogerio, blz né?
é isso mesmo que eu preciso!
Só que estou tentando entender para implementar o meu algoritmo aqui.
Obrigado!
C
carlinhoscomp
O exemplo do Rogerio no meu caso não deu certo, pq sempre que atualizo a minha tabela eu apago tudo e preencho novamente.
Uma solução pro meu caso pensei da seguinte forma:
criar um ouvinte(listener) para a barra de rolagem (jscrollpane), quando a barra movimentar, pegar o valor referente a posição da barra.
após preencher a tabela, setar o valor obtido na barra de rolagem(jcrollpane).
Agora o problema é, COMO FAZER ISSO??
Obrigado pela dica Rogerio.
C
carlinhoscomp
Consegui resolver o problema!
Ficou assim:
//Variaveis globaisJScrollBarbarraHorizontal;JScrollBarbarraVertical;JScrollPanejspTabela;intPOSICAO_SCROLL_X=0;intPOSICAO_SCROLL_Y=0;publicvoidcriaTabela(){//...barraHorizontal=jspTabela.getHorizontalScrollBar();barraVertical=jspTabela.getVerticalScrollBar();// Adciona no listenerbarraHorizontal.addAdjustmentListener(newAdjustmentListener(){publicvoidadjustmentValueChanged(AdjustmentEventevt){POSICAO_SCROLL_X=barraHorizontal.getValue();}});barraVertical.addAdjustmentListener(newAdjustmentListener(){publicvoidadjustmentValueChanged(AdjustmentEvente){POSICAO_SCROLL_Y=barraVertical.getValue();}});}publicvoidatualizaTabela(){//...try{barraHorizontal.setValue(POSICAO_SCROLL_X);}catch(Exceptione){//não existe esta posição após atualização da tabela}try{barraVertical.setValue(POSICAO_SCROLL_Y);}catch(Exceptione){//não existe esta posição após atualização da tabela}}
R
rogeriopaguilar
Quando eu li sua mensagem pela primeira vez imaginei alguma coisa parecida com o que você fez, tipo guardar o valor antes de atualizar e depois restaurar o valor após atualizar, mas aí fiz o teste e vi que a tabela ficou no local sem eu fazer nada, hehehe
Legal que funcionou…