2017-05-19 3 views
0

Je travaille sur un projet personnel avec Java et Swing sous Eclipse. J'ai une JTable personnalisée pour rendre les cellules."prepareRenderer" ne fonctionne pas lorsque je mets des données de xml dans mon customJTable

public class CustomJTable extends JTable{ 

@Override 
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) 
{ 
    Component c = super.prepareRenderer(renderer, row, column); 

    // change background of rows if [row,13] is even 
    c.setBackground(getBackground()); 
    if((int)getModel().getValueAt(row, 13) %2 == 0) 
     c.setBackground(Color.YELLOW); 

    // change font, border e background of cells if a string field is equal to some predeterminated value 
    Font myFont = new Font(TOOL_TIP_TEXT_KEY, Font.ITALIC | Font.BOLD, 12); 
    c.setForeground(getForeground()); 

    if (getModel().getValueAt(row, column)=="VALUE"){ 
     ((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.RED)); //needs cast for using setBorder 
     c.setFont(myFont); 
     c.setForeground(Color.RED); 
     c.setBackground(new Color(255, 230, 230)); 
    } 

    //set disabled cells appearance 
    if (getModel().getValueAt(row, column)=="DISABLED"){ 
     ((JComponent) c).setBorder(new MatteBorder(1, 1, 1, 1, Color.GRAY)); 
     c.setForeground(Color.LIGHT_GRAY); 
     c.setBackground(Color.LIGHT_GRAY); 
    } 

    return c; 
} 

Mon CustomJTable prendre des valeurs d'une coutume TableModel (étend AbstractTableModel) qui contient un vecteur de classe avec des méthodes overrided.

Si j'ajoute un élément dans le vecteur avec quelque chose comme ceci myModel.getVector().add(element) Je n'ai aucun problème. Une fois que j'ai tapé myTable.updateUI(), Row est automatiquement ajouté à CustomJtable et il est également affiché. Tout est parfait!!!

Le problème se produit lorsque j'essaie d'ajouter des lignes d'un fichier .XML externe que j'ai enregistré auparavant. Les données que j'ai ajoutées à ma JTable sont correctes, l'arrière-plan des lignes JAUNES a également changé, mais les cellules ne sont pas rendues (pas les bordures des cellules, pas les polices, pas les cellules rouges).

J'ai tout essayé. validate(), repaint(), fireTableCellChanged() ... Je ne trouve pas d'erreur. Quelqu'un peut-il m'aider?

Répondre

2

getModel().getValueAt(row, column)=="VALUE" >> c'est plus que probablement une erreur déjà. Si vous voulez comparer les chaînes, vous devez utiliser Object.equals pour les comparer. Comme ceci: "VALUE".equals(getModel().getValueAt(row, column).toString()). Vous faites la même erreur un peu plus loin par rapport à la chaîne .

La deuxième erreur est que vous utilisez des index de vue pour indexer dans le modèle. Les paramètres row et column transmis dans la méthode JTable.prepareRenderer sont des index de vue. Vous ne pouvez pas les utiliser pour indexer le modèle comme vous le faites dans getModel().getValueAt(row, column). Vous devez traduire ces index en utilisant JTable.convertRowIndexToModel et JTable.convertColumnIndexToModel avant d'appeler le getModel().getValueAt(). Vous pouvez en lire plus à ce sujet dans la description introductive dans le JTable documentation. Vous pouvez également utiliser JTable.getValueAt() à la place. Ici vous pouvez utiliser les index de vue passés à JTable.prepareRenderer.

+0

OMG, merci beaucoup. Je suis revenu à Java depuis plusieurs années et je n'ai pas fait la différence entre les index de vue et les index de modèles. C'était le problème! –