Boa tarde!
Estou com um problema, já pesquisei e achei algo parecido (http://www.guj.com.br/java/88656-movimentar-jtable#474184), mas não está do jeito que deveria estar.
O meu caso é o seguinte:
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…
Alguém poderia me ajudar?
Eu fiz um exemplo aqui e a barra já fica onde está:
package teste;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class TesteFrame extends JFrame {
private static int numLinhas = 10;
static class Model extends AbstractTableModel {
public int getColumnCount() { return 10; }
public int getRowCount() { return numLinhas;}
public Object getValueAt(int row, int col) { return new Integer(row*col); }
public void adicionarLinha(){
numLinhas++;
fireTableRowsInserted(numLinhas, numLinhas);
}
};
Model modelo = new Model();
public TesteFrame(){
setSize(400, 200);
JTable table = new JTable(modelo);
JScrollPane scrollpane = new JScrollPane(table);
add(scrollpane);
new Thread(
new Runnable() {
@Override
public void run() {
while(true){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
modelo.adicionarLinha();
}
});
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
).start();
}
/**
* @param args
*/
public static void main(String[] args) {
new TesteFrame().setVisible(true);
}
}
Fala Rogerio, blz né?
é isso mesmo que eu preciso!
Só que estou tentando entender para implementar o meu algoritmo aqui.
Obrigado!
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.
Consegui resolver o problema!
Ficou assim:
//Variaveis globais
JScrollBar barraHorizontal;
JScrollBar barraVertical;
JScrollPane jspTabela;
int POSICAO_SCROLL_X = 0;
int POSICAO_SCROLL_Y = 0;
public void criaTabela(){
//...
barraHorizontal = jspTabela.getHorizontalScrollBar();
barraVertical = jspTabela.getVerticalScrollBar();
// Adciona no listener
barraHorizontal.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent evt) {
POSICAO_SCROLL_X = barraHorizontal.getValue();
}
});
barraVertical.addAdjustmentListener(new AdjustmentListener() {
public void adjustmentValueChanged(AdjustmentEvent e) {
POSICAO_SCROLL_Y = barraVertical.getValue();
}
});
}
public void atualizaTabela(){
//...
try {
barraHorizontal.setValue(POSICAO_SCROLL_X);
} catch (Exception e) {
//não existe esta posição após atualização da tabela
}
try {
barraVertical.setValue(POSICAO_SCROLL_Y);
} catch (Exception e) {
//não existe esta posição após atualização da tabela
}
}
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…
[]'s