web-dev-qa-db-fra.com

Tri de colonne cliquable JTAble: le tri trie le contenu des cellules, mais ne met pas à jour la mise en forme de cellule?

J'ai une sorte d'JTable configuré pour utiliser une extension personnalisée du AbstractTableModel. Cependant, certains comportements de ce tableau sont ce à quoi je m'attendais et j'aimerais des conseils sur la manière de comprendre cela.

J'ai la jtalle configurée pour être tritable en utilisant:

thisJTable.setAutoCreateRowSorter(true);

Cela me permet de trier la table en cliquant sur les en-têtes de colonne comme prévu.

Cependant, je trouve que lorsque je trie la table en cliquant sur les en-têtes de colonne, le formatage (arrière-plan et la couleur de premier plan) de mes lignes ne sont pas triés également.

J'avais mis en place ces lignes pour être codée couleur en fonction des valeurs qu'ils contiennent. Lorsque je trie par l'en-tête de colonne, le formatage à un numéro de ligne donné reste le même (bien que le contenu précédemment dans cette rangée soit déplacé).

La couleur de la ligne est définie en remplaçant la valeur par défaut prepareRenderer appelez pour la JTABLE:

thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(row));
        c.setForeground(thisModel.getRowForeColor(row));
        return c;
    }
};

Y a-t-il une meilleure façon/différente de s'approcher cela?

Devrais-je utiliser une méthode différente pour faire mon rendu, une méthode qui mettrait à jour le rendu de la Jtalie sur une sorte?

Ou est-ce que je veux regarder dans l'écriture de ma propre méthode de tri?

solution (merci mkorbel!

Je pensais que je posterais ma solution, car je devais jouer un peu avec cela depuis que je n'étais pas sûr si le nouvel indice serait également transmis au préparateur.

 thisTable = new JTable(thisModel){

    //Set up custom rendering - Sets background color of row to correct value
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {

        int viewIdx = row;
        int modelIdx = convertRowIndexToModel(viewIdx);
        Component c = super.prepareRenderer(renderer, row, column);
        CustTableModel thisModel = (CustTableModel) getModel();
        c.setBackground(thisModel.getRowBackgroundColor(modelIdx));
        c.setForeground(thisModel.getRowForeColor(modelIdx));
        return c;
    }
};
19
Panky

vous devez Convertir l'index de la ligne de la vue sur le modèle

int modelRow = convertRowIndexToModel(row);
17
mKorbel

Vous pouvez activer le tri de table en cliquant sur l'en-tête en utilisant cette table.setAutoCreateRowSorter(true);

pour plus d'informations, visitez ce site http://www.codejava.net/java-se/swing/6-techniques-for-sorting-jtable-YOUVE-Hould-klow

2
Filip Kováč