Problema com barra de rolamento de tabela[RESOLVIDO]

11 respostas
V

Estou tendo problemas com a barra de rolamento de uma tabela.
É o seguinte, tenho uma tabela com vários contatos cadastrados, e um método para selecionar a linha de um determinado contato procurado.
A linha é selecionada numa boa, porém, se o contato estiver em uma posição pelo qual só se possa ser vizualizado baixando a barra de rolamento, ele não é vizualizado.
Resumindo, quero que a tabela abaixe o rolamento automatico quando necessário, para que o contato seja visualizado.

Segue abaixo o método de procura.

public boolean buscarDadosNome(String nome){
       for (linhas = 0; linhas < tabela.getRowCount(); linhas ++ ){
            if(tabela.getValueAt(linhas, 0).equals(nome)){

                return true;

            }


        }
                return false;
    }
Cliente clienteAux;
       String campoBusca = tfBuscaCliente.getText();
       if(campoBusca.isEmpty()){
           JOptionPane.showMessageDialog(null, "Campo Vazio");
       }
       else{
           clienteAux = banco.buscarUsuario(campoBusca);
           if(buscarDadosNome(clienteAux.getNome())){
              tabela.setRowSelectionInterval(linhas, linhas);

11 Respostas

juno.rr

by Example Depot http://www.exampledepot.com/egs/javax.swing.table/Vis.html

// Ensure that the cell (1,2) is visible
int rowIndex = 1;
int vColIndex = 2;
scrollToVisible(table, rowIndex, vColIndex);

// Assumes table is contained in a JScrollPane. Scrolls the
// cell (rowIndex, vColIndex) so that it is visible within the viewport.
public void scrollToVisible(JTable table, int rowIndex, int vColIndex) {
    if (!(table.getParent() instanceof JViewport)) {
        return;
    }
    JViewport viewport = (JViewport)table.getParent();

    // This rectangle is relative to the table where the
    // northwest corner of cell (0,0) is always (0,0).
    Rectangle rect = table.getCellRect(rowIndex, vColIndex, true);

    // The location of the viewport relative to the table
    Point pt = viewport.getViewPosition();

    // Translate the cell location so that it is relative
    // to the view, assuming the northwest corner of the
    // view is (0,0)
    rect.setLocation(rect.x-pt.x, rect.y-pt.y);

    // Scroll the area into view
    viewport.scrollRectToVisible(rect);
V

Coloquei o código, porém não fez nada.
Pode me explicar melhor?

ferreira2006

Num codigo que fiz usei assim:
Tinha uma JTable listando uma série de coisas e um JTextField no qual se digitava o nome que se pretentia localizar;
Neste exemplo ele seta letra por letra, se digitar ‘a’ ele vai selecionar o primeiro registro que tenha ‘a’ no campo consultado, se digitar ‘ab’ o primeiro com ‘ab’ e assim por diante, tenta usar/adaptar aí:

// método que retorna um keyAdapter

	public KeyAdapter buscaCampo( final JTextField campo, final JTable tbl){
		   KeyAdapter ka = new KeyAdapter() {			
		        @Override
				public void keyReleased(KeyEvent arg0) {
					int tamanho = campo.getText().length();
					String nome = campo.getText();
					for (int linha = 0; linha < tbl.getRowCount(); linha++) {
                                                                          //  1 = coluna 1
						String numeroEquip = (String) tbl.getValueAt(linha, 1);
						if ((numeroEquip.length() >= tamanho)
								&& (numeroEquip.substring(0, tamanho).equals(nome.toUpperCase()))) {
							tbl.setRowSelectionInterval(linha, linha);
							return;
						}
					}
				}
			};
			return ka;
	   }



JTextField pesquisaTextField = new JTextField(10);		
pesquisaEquip.addKeyListener(buscaCampo(pesquisaTextField, tabela));
// a cada letra digitada sera realizada a busca considerando o que está digitado
V

[email removido]

eu colokei mas nao deu mt certo.

public KeyAdapter buscaCampo( final JTextField campo, final JTable tbl){
            KeyAdapter ka = new KeyAdapter() {
                 @Override
                 public void keyReleased(KeyEvent arg0) {
                     int tamanho = campo.getText().length();
                     String nome = campo.getText();
                     for (int linha = 0; linha < tbl.getRowCount(); linha++) {
                                                                           //  1 = coluna 1
                         String numeroEquip = (String) tbl.getValueAt(linha, 1);
                         if ((numeroEquip.length() >= tamanho)
                                 && (numeroEquip.substring(0, tamanho).equals(nome.toUpperCase()))) {
                             tbl.setRowSelectionInterval(linha, linha);
                             return;
                         }
                     }
                 }
             };
             return ka;
        }
private void tfBuscaClienteActionPerformed(java.awt.event.ActionEvent evt) {
            this.addKeyListener(buscaCampo(tfBuscaCliente, tabela));
    }
ferreira2006

Seguinte: no meu caso eu usava em um JTextField, ou seja adicionava o metodo criado com keyListner do meu JTextField.

Para você deveria ser ± assim:

V

Continua sem nenhuma ação,porém, agora quando eu digito um nome, e o apago, a primeira linha é selecionada.

sabe dizer o que pode ser?

ferreira2006

teria que ve o teu código pra analizar…
Mas me diz uma coisa … o eu primeiro metodo tava funcionando o problema era o scrool que não mudava pra linha selecionada, certo?

ferreira2006

Tenta isso:

// Adicinar um SelectionListner em sua tabela
	 tabela.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
			 
			public void valueChanged(ListSelectionEvent e) {			
			        // O scroll se posicionará na linha que estiver selecionada	
				tabela.scrollRectToVisible(tabela.getCellRect(tabela.getSelectedRow(), 0, true));				
			}
			
		});
V

A questão é a seguinte.
Eu tenho uma tabela que tem um tamanho visualmente pequeno, que da apenas para ver 4 contatos, para ver os contatos restantes eu teria que abaixar a barra de rolamentos.
Ai se eu tiver uns 10 contatos cadastrados, e quiser buscar o contato 7, ele vai selecionar, porém, vai continuar mostrando os 4 primeiros contatos.
Então o que eu quero é que se eu buscar o contato numero 7,automaticamente, a barra desça.
Deu pra entender agora?

ferreira2006

Pramim dá certo com o último código repassado.

V

[email removido]

Obg, deu certinho.

Criado 27 de março de 2011
Ultima resposta 30 de mar. de 2011
Respostas 11
Participantes 3