JTable Cliquable Colonne de Tri: le Tri des sortes de contenu des cellules, mais n'a pas de mise à jour mise en forme de cellule?

J'ai un sortable JTable configuré pour utiliser une extension personnalisée de la AbstractTableModel. Cependant, certains comportements de ce tableau est ce que j'attendais, et j'aimerais quelques conseils sur la façon de comprendre cela.

J'ai la JTable mis en place pour être sortable à l'aide de:

thisJTable.setAutoCreateRowSorter(true);

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

Cependant, je trouve que quand je trier le tableau en cliquant sur les en-têtes de colonne, la mise en forme (en arrière-plan et la couleur de premier plan) de mes lignes ne sont pas triées.

J'avais mis en place ces lignes à code couleur basé sur les valeurs qu'elles contiennent. Quand j'ai trier par colonne d'en-tête de la mise en forme à un NUMÉRO de ligne reste la même (bien que le contenu qui a déjà été dans cette ligne déplacé).

La couleur de la ligne est réglé en remplaçant la valeur par défaut prepareRenderer appel à 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;
    }
};

Est-il un meilleur/les différentes façon d'aborder cette question?

Dois-je utiliser une autre méthode pour faire mon rendu, une méthode qui permettrait de mettre à jour le rendu de la JTable sur un tri?

Ou dois-je chercher dans l'écriture de mon propre méthode de tri?

Solution (Merci mKorbel!)

J'ai pensé que je poste ma solution, car j'ai dû jouer avec un peu car je n'étais pas sûr si le nouvel indice serait passé à la prepareRenderer.

 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;
    }
};
J'ai également besoin de s'assurer que le contenu basé sur formmatting est appliquée aux lignes après que le contenu est mis à jour, mais je n'ai pas abordé encore. Je suis déjà en écrasant custTableModel.setValueAt(Object, int, int) afin pensais que j'avais beaucoup d'options là, mais pensé que je devrais mentionner que.
votre prepareRenderer ne rien faire et complitating avec CustTableModel thisModel = (CustTableModel) getModel();, supprimez-le, moteur de Rendu est seulement sur le formatage, changement de Couleur, etc, pas pour créer JComponent, don9t faire
Je ne suis pas sûr si je suis votre commentaire. getRowForeColor et getRowBackgroundColor ajouter conditionnelle de coloration de la ligne, sur la base du contenu de la ligne (donc en passant rowIdx). Je suis l'aide de la super méthode pour créer le composant et puis tout simplement le réglage de l'arrière-plan et la couleur de premier plan de ce composant. J'ai besoin d'obtenir le TableModel, et de le jeter à mon CustTableModel parce que getRow[Avant|arrière-plan]la Couleur n'est pas une méthode définie pour d'autres modèles de table.
iam curieux de connaître le détail de getRowBackgroundColor()); code de l'intérieur ? @Panky

OriginalL'auteur Panky | 2012-04-25