Bem gente olhem o código abaixo, é uma pequena JTABLE com a função de ordenação de colunas. to querendo implementar ações quando o usuário clicar nas colunas para ordenalas, bem para fazer isso não é segredo para quase ninguém, basta apenas adicionar um RowSorterListener no seu objeto RowSorter, mas olha só que coisa, o código designado para ser executado quando o usuário mandar ordenar as colunas é executado duas vez seguidas :shock:
Isso mesmo, rodem o código e verão que a palavra “teste” é exibida duas vezes.
O que pode está causando isso? será Bug no método?
Grato!
import javax.swing.*;
import javax.swing.event.RowSorterEvent;
import javax.swing.table.*;
import java.awt.*;
import javax.swing.event.RowSorterListener;
public class SortTable {
public static void main(String args[]) {
Runnable runner = new Runnable() {
public void run() {
JFrame frame = new JFrame("Ordenando um JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rows[][] = {
{"AMZN", "Amazon", 41.28},
{"EBAY", "eBay", 41.57},
{"GOOG", "Google", 388.33},
{"MSFT", "Microsoft", 26.56},
{"NOK", "Nokia Corp", 17.13},
{"ORCL", "Oracle Corp.", 12.52},
{"SUNW", "Sun Microsystems", 3.86},
{"TWX", "Time Warner", 17.66},
{"VOD", "Vodafone Group", 26.02},
{"YHOO", "Yahoo!", 37.69}
};
String columns[] = {"Sigla", "Nome", "Preço"};
TableModel model =
new DefaultTableModel(rows, columns) {
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
JTable table = new JTable(model);
RowSorter<TableModel> sorter =
new TableRowSorter<TableModel>(model);
sorter.addRowSorterListener(new RowSorterListener() {
public void sorterChanged(RowSorterEvent e) {
System.out.println("teste");
}
});
table.setRowSorter(sorter);
JScrollPane pane = new JScrollPane(table);
frame.add(pane, BorderLayout.CENTER);
frame.setSize(300, 150);
frame.setVisible(true);
}
};
EventQueue.invokeLater(runner);
}
}