Rolar JTable automaticamente ao abrir a tela

Pessoal,

Não estou conseguindo fazer com que ao mostrar uma JTable a tela (JScrollPane) seja rolado automaticamente para a linha selecionada.

A linha selecionada não está visível na tela, tentei implementar o scrollRectToVisible mas não funcionou, não dá erro mas também não faz o necessário.

O meu método onde implementei este tratamento é este:

    public void SelecionaLinha(Object pCodigo) {
      
       int iLinha = -1;
         
       for (int iSeq = 1 ; iSeq < this.getRowCount() ; iSeq++) {
          if (this.getValue(iSeq,0).equals(pCodigo)) {
             iLinha = iSeq;
             break;
          }
       }
       
       if (iLinha != -1) {
          this.changeSelection(iLinha,0,false,false);
       } else {
          this.changeSelection(0,0,false,false);
       }

       if ( this.getParent() instanceof JViewport ){
          JViewport viewport = (JViewport)this.getParent();
          Rectangle rect = this.getCellRect(iLinha, 0, true);
          Point pt = viewport.getViewPosition();
          rect.setLocation(rect.x-pt.x, (rect.y-pt.y)+this.getRowHeight());
          viewport.scrollRectToVisible(rect);
       }

    }

Da linha 18 até a linha 24 é a lógica para rolar a tela, mas não está "rolando"…

Na definição do JScrollPane estou fazendo assim:

      JScrollPane spTabela = new JScrollPane();
      spTabela.setViewportView(tabela);

      tabela.SelecionaLinha(pCodSelected);

Alguém sabe o dizer porque não funciona?

tente trabalhar assim:

pegue o getRowHeight() da jtable…assim tu sabe o tamanho de cada linha da tabela…
se tu tem a linha onde vc quer chegar, entao tu sabe em pixels onde está a linha que vc quer q apareça…

No JScrollPane, pegue o getHorizontalScrollBar()…Esse Método te retorna o JScrollBar…

Nesse objeto, tu pode setar o value da unidade…tente achar a relação de pixel/unidade do jscrollbar…

achada a relação, multiplique essa constante pelo número de pixels necessários até chegar a tua linha, e seta esse valor no JScrollBar…

talvez funcione :stuck_out_tongue:

Não entendi o que você quis dizer…

A forma como codifiquei eu peguei na Net, deveria funcionar…

Acho que devo estar esquecendo de algo, só não sei o que é…

Olá andvenancio,
estava com uma dúvida similar a sua. Ela foi respondida por meio deste tópico.
Dá uma olhada, acho que vai te ajudar.

Atenção para o post do ViniGodoy, nele acho que tem o que vc precisa.

http://www.guj.com.br/posts/list/144284.java#779964

Espero ter ajudado!
T+

Fred,

Obrigado pela ajuda.

Mas infelizmente funcionou apenas "parcialmente".

Até está rolando a JTable, mas não o suficiente.

Está mais ou menos assim: Se a linha selecionada for na segunda, terceira ou quarta página faz a rolagem até o registro selecionado. Porém quanto "mais para a frente" eu deixo uma linha selecionada, mais "atrasada" fica a visualização.

Ou seja, parece que não está rolando o suficiente.

Até fiz um teste alterando o método setViewPortPosition, colocando o setLocation(100000,100000), mas mesmo com um número grande desses não chega na última linha (o tamanho da minha JTable está em 11200 pixels).

Aqui está a parte do código onde eu crio a JTable (a classe utilizada é a DBGrid, extendida a partir da JTable):

      DBGrid tabela = new DBGrid(this, pTela, dTelaPesquisar, pCadastro, pRegCadastro, pIsZoom, ptfCodigo);
            
      try {
         tabela.setDataSet(rsPesquisa);
      } catch (Exception e) {
        String stackMensagem = utilInstance.montaMensagemErro(e.toString(),e.getStackTrace());
        utilInstance.exibeMensagem("Erro","Erro na tentativa de seleção dos registros.",stackMensagem,utilInstance.MSGERROR);
      }

      dTelaPesquisar.setDefaultCloseOperation(javax.swing.JFrame.DO_NOTHING_ON_CLOSE);
      dTelaPesquisar.addWindowListener(new dTelaPesquisarWindowListener(dTelaPesquisar));
      dTelaPesquisar.setModal(true);
      dTelaPesquisar.getContentPane().setLayout(null);
      if (pCadastro.equals("PALAVRA")) {
         dTelaPesquisar.setTitle("Pesquisa de Palavras");
      }

      dTelaPesquisar.getContentPane().add(pnDados,null);
      dTelaPesquisar.getContentPane().add(pnBotoes,null);

      dTelaPesquisar.setSize((utilInstance.getPrincipal().getWidth() - 10), ALTURA);

      JScrollPane spTabela = new JScrollPane();
      spTabela.setViewportView(tabela);

      tabela.SelecionaLinha(pCodSelected);

O método SelecionaLinha está assim:

    public void SelecionaLinha(Object pCodigo) {
      
       int iLinha = -1;
         
       for (int iSeq = 1 ; iSeq < this.getRowCount() ; iSeq++) {
          if (this.getValue(iSeq,0).equals(pCodigo)) {
             iLinha = iSeq;
             break;
          }
       }
       
       if (iLinha != -1) {
          this.changeSelection(iLinha,0,false,false);
          Utilidades.scrollToVisible(this, iLinha);
       } else {
          this.changeSelection(0,0,false,false);
       }

    }

Ou seja, quando existir uma linha selecionada eu chamo a função para rolar a JTable.

Teria como analisar o código acima para ver onde foi que errei?