rowSorter num/num

3 respostas
danielmorine

Eu fiz uma tabela, onde eu ordeno as linhas numericamente usando um rowSorter().
No entanto existe uma coluna, que eu mostro da seguinte maneira:
10/15,
5/11,
8/13,

Como que eu faria para ordenar a linha pela primeira variavel (5,8,10) e não pelo valor na tabela, que é uma string… e acaba ficando (10,5,8)??
Alguém tem alguma sugestão para me ajudar?

3 Respostas

al.barbosa

Se a coluna que você quer ordenar for uma String, ele ficará em ordem alfabética, causando o problema que você falou.

Uma solução é criar uma classe para representar os elementos da coluna a ordenar.

Essa classe precisa implementar a interface Comparable, fornecendo o método compareTo(). Nesse método você programa a forma como os elementos serão comparados para ordenar a tabela, o que dá uma grande flexibilidade.

Precisa também implementar o método toString() para informar como os elementos irão aparecer na tabela.

Abaixo um exemplo. A classe DoisValores implementa a interface Comparable. No método compareTo() informo como os elementos devem ser comparados.
Obs.: o método compareTo() retorna um inteiro negativo se o elemento da classe é menor que o argumento; 0 se são iguais e um valor positivo se é maior.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
import java.util.regex.*;

public class Estudos extends JFrame{
  private TableRowSorter<TableModel> sorter;
  public Estudos(){
    super("Tabela ordenada pela segunda coluna");	
        
    // constrói a tabela
    TableModel model = new MyTableModel();
    final JTable tabela = new JTable(model);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));

    sorter = new TableRowSorter<TableModel>(model);

    ArrayList sortKeys = new ArrayList();
    sortKeys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
    sorter.setSortKeys(sortKeys);

    tabela.setRowSorter(sorter);
	
    Container c = getContentPane();
    c.setLayout(new FlowLayout());
			
    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);
    	
    setSize(400, 300);
    setVisible(true);
  }
	
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

class MyTableModel implements TableModel {
    // colunas da tabela
    private String[] columns = {"Cidade", "Valores", "Habitantes"};
		
    // conteúdo da tabela	
    private Object[][] rows = {
        {"Goiânia", new DoisValores(10,12), "43.023.432"},
        {"São Paulo", new DoisValores(5,13), "5.343.234"},
        {"Rio de Janeiro", new DoisValores(9,15), "6.434.212"},
        {"Jussara", new DoisValores(8,9), "87.454"},
        {"Barra do Garças", new DoisValores(20,6), "64.344"}
    };


    public String getColumnName(int col) {
        return columns[col].toString();
    }
    public int getRowCount() { return rows.length; }
    public int getColumnCount() { return columns.length; }
    public Object getValueAt(int row, int col) {
        return rows[row][col];
    }
    public boolean isCellEditable(int row, int col)
        { return true; }
    public void setValueAt(Object value, int row, int col) {
        rows[row][col] = value;
        //fireTableCellUpdated(row, col);
    }

    public void addTableModelListener(TableModelListener l){
    }
    public void removeTableModelListener(TableModelListener l){
    }


  public Class getColumnClass(int column) {
    Class returnValue;
    if ((column >= 0) && (column < getColumnCount())) {
      returnValue = getValueAt(0, column).getClass();
    } else {
      returnValue = Object.class;
    }
    return returnValue;
  }
}

class DoisValores implements Comparable<DoisValores>{
   int valor1,valor2;
   public DoisValores(int valor1, int valor2){
      this.valor1 = valor1;
      this.valor2 = valor2;
   }
   public String toString(){
      return valor1+"/"+valor2;
   }

   public int getValor1(){
      return valor1;
   }
   
   public int getValor2(){
      return valor2;
   }

   public int compareTo(DoisValores d){
      return this.getValor1() - d.getValor1();
   }
}
danielmorine

al.barbosa

Muito obrigado,
Você deu uma clareada boa no que eu precisava entender.
Valeu mesmo…
Um abraço.
Daniel Morine

T

Tenho esse codigo do rowsorter queria que filtrasse por inteiros, tem como finalidade pesquisar os alunos cadastrados queria que pesquisar usando o codigo dos alunos!!
Que mudanças tenho que fazer no codigo Alguem poderia me ajudar??

codigo:

public class rowSorter extends Converter {

private JTable table;

public JTable getTable() {

return table;

}
public void setTable(JTable table) {

this.table = table;

}
public Object convertForward(Object value) {

return value.toString();

}

public Object convertReverse(Object mask) {
TableRowSorter sorter = new TableRowSorter(table.getModel());

sorter.setRowFilter(RowFilter.regexFilter("." + mask + "."));

return sorter;

}

}
Criado 30 de julho de 2012
Ultima resposta 6 de nov. de 2012
Respostas 3
Participantes 3