[Java] Tri des valeurs doubles dans JTable



Answers

ce code pourrait être votre SSCCE , pouvez-vous nous montrer le problème sur ce code, rien de code snipped que vous avez posté

import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableTest2 {

    public void initGUI() {
        String[] columnNames = {"numbers","double", "text"};
        Object[][] data = {{1, 0.81, "A"}, {10, 5.268752005, "B"}, {7, 100.0,"C"},{6, 52.879999, "A"},
        {4, 62.50, "B"}, {2, 854.9999, "C"},{11, 19.01, "A"}, {100, 0.0009, "B"}, {20, 100.09, "C"}};
        JTable table = new JTable(new DefaultTableModel(data, columnNames) {

            private static final long serialVersionUID = 1L;

            @Override
            public java.lang.Class<?> getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
        });
        table.setAutoCreateRowSorter(true);
        table.getRowSorter().setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING)));
        JFrame frame = new JFrame("LFIXimate");
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TableTest2().initGUI();
            }
        });
    }
}
Question

J'ai trouvé quelques questions liées à cela, mais je n'ai pas trouvé une solution simple à mon problème.

Je ne peux pas trouver un moyen de faire correctement trier mes valeurs JTable Double.

J'ai étendu AbstractTableModel pour recevoir un tableau de classes et retourner les types appropriés par colonne:

class TableModelMod extends AbstractTableModel{

    private ArrayList data;
    private String [] headers;
    private Class [] types;

    TableModelMod(String [] heads, ArrayList datas, Class [] classes){
        headers = heads;
        data = datas;
        types = classes;
    }
    ... 
    @Override public Class getColumnClass(int c){
        if (c > types.length - 1)
            return null;
        else 
            return types[c];
    }
...

Et puis dans mon constructeur JTable personnalisé:

TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel());

Mais alors je reçois cette erreur lors de l'ajout de lignes:

java.lang.IllegalArgumentException: Cannot format given Object as a Number

Il échoue à la méthode DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos) qui accepte la plupart des types numériques mais Double.

Si j'utilise une autre classe pour les colonnes Double, je n'ai pas d'erreur mais le tri ne fonctionne toujours pas comme prévu. J'ai essayé avec différentes classes numériques mais aucune ne semble trier correctement:

@Override public Class getColumnClass(int c){
    if (c > types.length - 1)
        return null;
    else if (types[c] == Double.class)
        return Number.class;
    else 
        return types[c];
}

Je ne sais pas si j'ai besoin de mettre en œuvre un RowSorter personnalisé, un CellRenderer personnalisé ou les deux.

Quelqu'un pourrait-il me guider sur la façon de résoudre ce problème de façon plus simple?

Merci beaucoup et meilleures salutations.

EDITED: RESOLU

C'est assez embarrassant de dire où était le problème.

La ArrayList contenant les lignes Object [] a été remplie à partir d'une base de données ResultSet en utilisant getString (int) au lieu de getObject (int) ou getDouble (int), donc la valeur n'a pas pu être utilisée comme Double par le moteur de rendu. C'est bizarre qu'il n'ait pas donné d'exceptions en utilisant Integer ou Number comme classe de colonnes, mais il a été trié comme une chaîne de toute façon. Je cherchais un problème dans les mauvaises classes car j'étais convaincu que mon ArrayList ne contenait que des objets.

Merci beaucoup pour vos exemples, en les regardant j'ai remarqué que mes doubles étaient en fait des cordes et ensuite je pouvais trouver où la conversion se passait.






Links