Obtendo a ordem do TableRowSorter

Bem gente é o seguinte, em minha JTable eu estou usando TableRowSorter para ordenar minhas linhas porém em determinado ponto eu preciso saber em que ordem está a ordenação atual de uma determinada coluna, tipo, se está crescente ou decrescente, alguém sabe dizer se existe uma forma de fazer isso? tipo uma espécie de metodo getSorterOrdem(int colum).

Grato!

aff, ninguém nunca precisou fazer isso?

Acho que o método TableRowSorter.getSortKeys() resolve o seu problema:

http://java.sun.com/javase/6/docs/api/javax/swing/RowSorter.html#getSortKeys()

bem já me sugeriram isso em outro forum para nao reescrever aqui tudo i que ja escrevi lá vou postar em Quote o discursão.

[quote]
Tem como você obter a ordenação de uma coluna sim, nosso amigo Swing utiliza MVC ao extremo então, infelizmente, o acesso a alguns recursos nem sempre é trivial.

Já consultou a documentação do RowSorter?
Ele tem uma inner-class chamada SortKey, que possui o método getSortOrder() que retorna um enum do tipo SortOrder

Baseie-se no código abaixo, não fiz nenhum teste, mas deve funcionar

  1. List<RowSorter.SortKey> sortKeys = meuObjetoRowSorter.getSortKeys();
  2. RowSorter.SortKey sortKey = sortKeys.get(indiceDaColuna);
  3. SortOrder sortOrder = sortKey.getSortOrder();
  4. switch (sortOrder) {
  5. case ASCENDING :  
    
  6.     System.out.println("ORDENACAO ASCENDENTE");  
    
  7.     break;  
    
  8. case DESCENDING :  
    
  9.     System.out.println("ORDENACAO DECENDENTE");  
    
  10.     break;  
    
  11. case UNSORTED :  
    
  12.     System.out.println("NÃO ORDENADO");  
    
  13.     break;  
    
  14. default :  
    
  15.     System.out.println("Não deveria passar aqui");  
    
  16.     break;  
    
  17. }

Não deu certo, ta dando uma exceção IndexOutOfBoundsException, na linha

     RowSorter.SortKey sortKey = sortKeys.get(col);

Na verdade que tipo de lista é essa que o método getSortKeys() retorna?

abaixo segue o método que fiz para retornar a ordem do sorter.

  1. public static SortOrder getOrderSort(TableRowSorter sort, int col){  
    
  2.    List<RowSorter.SortKey> sortKeys = sort.getSortKeys();  
    
  3.    System.out.println(sortKeys.size());  
    
  4.    RowSorter.SortKey sortKey = sortKeys.get(col);  
    
  5.    SortOrder sortOrder = sortKey.getSortOrder();  
    
  6.    return sortOrder;  
    
  7. }  
    
public static SortOrder getOrderSort(TableRowSorter sort, int col){        List<RowSorter.SortKey> sortKeys = sort.getSortKeys();        System.out.println(sortKeys.size());        RowSorter.SortKey sortKey = sortKeys.get(col);        SortOrder sortOrder = sortKey.getSortOrder();        return sortOrder;     }

grato pela ajuda.

eu sei que é uma exceção referente ao indice da lista, mas ué eu estou passando um valor que esta dentro do intervalo da quantidade de colunas da tabela, ou seja, minha tabela tem 10 colunas sendo assim eu posso passar como parametro o intervalo de 0 a 9, eu estou passando 1 como parametro.

Se meu raciocinio está correto a linha
view plaincopy to clipboardprint?

List<RowSorter.SortKey> sortKeys = sort.getSortKeys();

cria uma lista com 10 elementos RowSorter.SortKey pq em minha tabela tem 10 colunas. Usei o
view plaincopy to clipboardprint?

  1.    System.out.println(sortKeys.size());  
    

    System.out.println(sortKeys.size()); para testar e ver se realmente a lista tem o mesmo número de elementos que o meu número de colunas e o resultado foi 0, ou seja, quando o método
    view plaincopy to clipboardprint?

  2. getOrderSort(TableRowSorter sort, int col)

getOrderSort(TableRowSorter sort, int col) é chamado alista é criada como vazia, ou seja, 0 elementos. Precebi também que quando clico no título de algumas colunas para ordenar as linhas e depois chamo o metodo
view plaincopy to clipboardprint?

  1. getOrderSort(TableRowSorter sort, int col)

getOrderSort(TableRowSorter sort, int col) ele passa a ter 3 elementos.

afinal a lista sortKeys não era pra ter a mesma quantidade de elementos que a minha quantidade de colunas independente de ja ter ou não alguma coluna ordenada?

Dei uma olhada na doc da SortKey e parece que não tem nada aver com o número de colunas da tabela.

ai a linha

  1.    RowSorter.SortKey sortKey = sortKeys.get(col);  
    

    RowSorter.SortKey sortKey = sortKeys.get(col); fica meio que infuncional pq a lista não tem a mesma quantidade de elementos que o número de colunas da minha tabela.

O que eu quero e fazer um metodo em que eu passe como parametro o número da coluna e o objeto TableRowSorter e ele me diga se a coluna está em ordem crescente, decrescente ou não está ordenada, e para isso baseando-me no seu exemplo a lista teria que ter 10 elementos que representariam as 10 colunas da minha tabela.

grato!

Andei dando uma olhada na doc do getSortKeys() cara não entendi ainda o que esse método faz. A doc diz que ele armazena umas especies de chaves, mas fica a questão, chave de que? de onde? Baseado no seu exemplo achei que ele armazenasse objetos que representariam as minhas colunas na JTable. Mas pelo que vi não se trata disso.

Agradeço a atenção. [/quote]

bem no outro forum paramos nessa estaca. O que vc me diz?

O mesmo que disse da primeira vez: use o método getSortKeys(). Esse método retorna uma Lista de objetos da classe RowSorter.SortKey, onde esses objetos representam a ordenação que está aplicada às colunas da JTable:

http://java.sun.com/javase/6/docs/api/javax/swing/RowSorter.SortKey.html

Para cada objeto da lista, chame o método getColumn() e você saberá o índice da coluna à qual ele se refere. E para saber se a coluna está ordenada de forma ascendente ou descendente, use getSortOrder().

http://java.sun.com/javase/6/docs/api/javax/swing/RowSorter.SortKey.html#getColumn()
http://java.sun.com/javase/6/docs/api/javax/swing/RowSorter.SortKey.html#getSortOrder()

Pow, gente não to conseguindo fazer isso funcionar, ja se esgotaram minhas idéias, alguém poderia me dar um exemplo de como fazer isso.
para não dar muito trabalho vou deixar aqui um código funcional de uma JTable simples ai quem se dispor a deixar o exemplo terá apenas que implementar o TableRowSorter.getSortKeys(), pode ser algo como um JOptionPane onde se digita o indice da coluna e depois se recebe o resultado (ASCENDING, DESCENDING, UNSORTED). abaixo segue o código.

[code]
import javax.swing.;
import java.awt.
;
import javax.swing.table.*;

public class Estudos2 extends JFrame{
int linha, coluna;

public Estudos2(){
super(“JTable”);

TableModel modelo = createTableModel();
JTable tabela = new JTable(modelo);
tabela.setPreferredScrollableViewportSize(new
     Dimension(350, 100));

// Instala o TableRowSorter.
TableRowSorter<TableModel> sorter;
sorter = new TableRowSorter<TableModel>(modelo);
tabela.setRowSorter(sorter);

Container c = getContentPane();
c.setLayout(new FlowLayout());

JScrollPane scrollPane = new JScrollPane(tabela);
c.add(scrollPane);

setSize(400, 300);
setVisible(true);

}

TableModel createTableModel(){
DefaultTableModel model = new DefaultTableModel(5, 2);
String[] colunas = {“Cidades”,“Estados”};
model.setColumnIdentifiers(colunas);
String[] cidades = {“Goiânia”, “Cuiabá”, “Brasília”,
“Barra do Garças”, “Fortaleza”};
String[] estados = {“GO”, “MT”, “DF”, “MT”, “CE”};

int nrows = model.getRowCount();
int ncols = model.getColumnCount();

for(int i = 0; i < nrows; i++){
  model.setValueAt(cidades[i], i, 0);
  model.setValueAt(estados[i], i, 1);
}

return model;

}

public static void main(String args[]){
Estudos2 app = new Estudos2();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}[/code]

Agradeço a todos que ajudarem.

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowSorter.SortKey;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class Estudos2 extends JFrame {
  int linha, coluna;

  public Estudos2() {
    super("JTable");

    TableModel modelo = createTableModel();
    final JTable tabela = new JTable(modelo);
    tabela.setPreferredScrollableViewportSize(new Dimension(350, 100));

    // Instala o TableRowSorter.
    final TableRowSorter<TableModel> sorter;
    sorter = new TableRowSorter<TableModel>(modelo);
    tabela.setRowSorter(sorter);

    Container c = getContentPane();
    c.setLayout(new FlowLayout());

    JScrollPane scrollPane = new JScrollPane(tabela);
    c.add(scrollPane);

    JButton botao = new JButton("Listagem do RowSorter");
    botao.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.out.println("Listando colunas e ordem de classificação:");
        List<? extends SortKey> sortKeys = sorter.getSortKeys();

        if (sortKeys != null) {
          for (SortKey sortKey : sortKeys) {
            System.out.println(
              "Coluna " + sortKey.getColumn() + " [" +
              tabela.getColumnName(sortKey.getColumn()) + "]: " +
              "Classificação " + sortKey.getSortOrder());
          }
        }

        System.out.println("Listagem concluída.");
      }
    });

    c.add(botao);

    setSize(400, 300);
    setVisible(true);
  }

  TableModel createTableModel() {
    DefaultTableModel model = new DefaultTableModel(5, 2);
    String[] colunas = { "Cidades", "Estados" };
    model.setColumnIdentifiers(colunas);
    String[] cidades = { "Goiânia", "Cuiabá", "Brasília",
      "Barra do Garças", "Fortaleza" };
    String[] estados = { "GO", "MT", "DF", "MT", "CE" };

    int nrows = model.getRowCount();
    int ncols = model.getColumnCount();

    for (int i = 0; i < nrows; i++) {
      model.setValueAt(cidades[i], i, 0);
      model.setValueAt(estados[i], i, 1);
    }

    return model;
  }

  public static void main(String args[]) {
    Estudos2 app = new Estudos2();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

aff quando pensei que tinha resolvido, olha só a cagada, a lista só armazena no máximo 3 chaves, dei uma olhada na doc descobri o metodo setMaxSortKeys(), usei ele no metodo mas não funcionou.

    public static SortOrder getOrderSort(JTable tabela, int col){

        SortOrder ord = SortOrder.UNSORTED;
        TableRowSorter sort = (TableRowSorter) tabela.getRowSorter();
        sort.setMaxSortKeys(10);
        List<? extends RowSorter.SortKey> sortKeys = sort.getSortKeys();
        for(RowSorter.SortKey key : sortKeys)
            if(col == key.getColumn())
                return key.getSortOrder();
        return ord;
    }

meu caro amigo fiel parceiro nesse tópico, e agora pra onde vamos.

Agradeço sua ajuda brow.

Agora sim resolvido, mudei o metodo e ficou assim.

        public static SortOrder getOrderSort(TableRowSorter sort, int col){  
            SortOrder ord = SortOrder.UNSORTED;  
            List<? extends RowSorter.SortKey> sortKeys = sort.getSortKeys();  
            for(RowSorter.SortKey key : sortKeys)  
                if(col == key.getColumn()){  
                    System.out.println(key.getColumn());  
                    return key.getSortOrder();  
                }  
            return ord;  
       }  

Ao inves de passar a JTable como parametro passei o objeto TableRowSorter já com o MaxSortKeys setado para receber a mesma quantidade de chaves que a quatidade de colunas da JTable.

             modelo = (TableModelSystemse)table.getModel();  
             sorter = new TableRowSorter<TableModel>(modelo);  
             sorter.setMaxSortKeys(modelo.getColumnCount());  
             table.setRowSorter(sorter);  

Valeu gente, te mais obrigado pela ajuda.

Ae, descupem por upar o tópico mas como se trata ainda do mesmo assunto resolvi aprovaitar ele mesmo.
Seguinte, como vcs podem perceber realmente consegui obter o tipo de ordenação de uma determinada coluna, porém, durante uns testes detectei um problema. Quando eu clico em uma coluna para ordena-la essa coluna fica ASCENDING, se eu clicar novamente ele muda para DESCENDING, e fica alternando conforme eu vou clicando, porém, digamos que eu deixe essa coluna como ASCENDING e depois click em outra coluna para ordenar, a coluna anterior continua como ASCENDING usando getSortOrder(). Axo que o correto seria que a coluna anterior voltase para UNSORTED, já que a ordenação não está mais sendo feita por ela.
Existe alguma forma de resolver isso? Para o meu caso resolveria o problema se ouvesse uma foma de determinar como eu quero a ordenação de uma coluna, tipo existe o metodo toggleSortOrder() que faz a ordenação de uma determinada coluna, mas infelizmente ele não nos permite determinar em que ordem queremos essa ordenação. Ele simplesmente verifica a ordenação atual e aplica uma ordenação na forma contraria, de ASCENDING para DESCENDING e vice-verssa.
Isso ja está me dando tanta dor de cabeça que eu ja estou até penssando em deixar tudo isso pra lá e ussar arquivos properties ou XML com JDOOM (que fica mais profissional) para gravar a ordenação das colunas. O que vcs me dizem disso?