2010-10-10 2 views
2

J'essaye de rendre une ligne spécifique de mon jtable (elle devrait avoir une couleur de fond différente et devrait avoir des caractères gras).Personnalisé TableCellRenderer ne fonctionne pas (rendu de ligne de table)

J'ai trouvé plusieurs questions sur la façon de mettre en œuvre une coutume TableCellRenderer (here et here) et le tutoriel How to Use Tables et celui-ci (Table Row Rendering). J'utilise un JInternalFrame pour afficher le code JTable. J'ai essayé d'implémenter les deux solutions mais ni getCellRenderer ni prepareRenderer ne sont appelés. Lors du débogage, je peux voir que mon nouveau jtable est créé, mais mon point d'arrêt à l'intérieur des méthodes n'est pas appelé.

Mon code ressemble:

this.add(createData(model)); 

private JComponent createData(ProfitLossTableModel model) { 
    JTable table = new JTable(model) { 

     public TableCellRenderer getCellRenderer(int row, int column) { 
      if ((row == 0) && (column == 0)) { 
       DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
       renderer.setHorizontalAlignment(JLabel.RIGHT); 
       renderer.setBackground(Color.red); 
       return renderer; 
      } else { 
       return super.getCellRenderer(row, column); 
      } 
     } 
    }; 

    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
    table.changeSelection(0, 0, false, false); 
    table.setAutoCreateRowSorter(true); 
    return new JScrollPane(table); 
} 

Comme vous pouvez le voir, le modèle est ma mise en œuvre d'un AbstractTableModel.

Bien sûr, il me manque quelque chose. J'ai essayé d'appeler repaint() pour voir si quelque chose est arrivé, mais rien ne s'est produit.

J'ai également essayé de mettre un JPane dans mon JInternalFrame et d'y ajouter le JScrollPane, mais rien ne s'est produit aussi.

Une aide?

TIA,

Bob

+0

Le code que vous avez posté semble correct. Cependant, nous ne connaissons pas le contexte dans lequel vous utilisez réellement ce code. Donc, votre premier travail consiste à créer un SSCCE (http://sscce.org) en utilisant le DefaultTableModel et voir si vous pouvez obtenir le code de travail. Si ce n'est pas le cas, vous postez tout le programme SSCCE à 15 lignes afin que nous puissions voir exactement ce que vous faites. Une fois que cela fonctionne, vous essayez d'utiliser votre TableModel personnalisé. – camickr

Répondre

2

Comme indiqué dans Concepts: Editors and Renderers, "la table invoque getColumnClass du modèle de table méthode, qui obtient le type de données des cellules de la colonne." Vous devez vérifier que votre implémentation de AbstractTableModel renvoie une valeur appropriée, comme suggéré dans ce example.

Addendum:

Je suis en train de rendre une ligne, pas une colonne.

L'approche Table Row Rendering de Rob Camick qui remplace prepareRenderer() semble à propos.

tabbedPane.addTab("FirstRow", createFirstRow(model)); 
... 
private JComponent createFirstRow(DefaultTableModel model) { 

    final Font font = new Font("Serif", Font.BOLD, 14); 

    JTable table = new JTable(model) { 

     public Component prepareRenderer(
       TableCellRenderer renderer, int row, int column) { 
      Component c = super.prepareRenderer(renderer, row, column); 
      if (!isRowSelected(row)) { 
       c.setBackground(row == 0 ? Color.yellow: getBackground()); 
       c.setFont(row == 0 ? font : getFont()); 
      } 
      return c; 
     } 
    }; 

    table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
    table.changeSelection(1, 1, false, false); 
    return new JScrollPane(table); 
} 
Questions connexes