2017-06-13 2 views
-1

J'ai une table en Java qui contient le contenu des répertoires. J'ai créé 5 comboBoxes qui naviguent l'utilisateur dans des dossiers et puis crée un JTable avec le contenu du dossier choisi, comme le nom de fichier, la date, le créateur, etc. Dans la 6ème colonne du tableau j'ai quelques valeurs de chaîne et selon chaque valeur Je veux changer la couleur de fond de cette cellule. Voici le dernier comboBox dans lequel je démarre le JTable.Changer la couleur d'arrière-plan de la cellule sur la table dynamique JTable

+1

Note rapide: 'catch (NullPointerException n) {}'?Vous ne devriez jamais attraper un NPE, et cela suggère que vous avez quelque chose de grave avec ce code. –

+2

Si vous avez besoin d'aide supplémentaire, vous voudrez créer et publier un [mcve] valide, un nouveau petit programme affiché dans votre question sous forme de texte au format texte. –

+2

Je vois maintenant qu'un MCVE a été demandé dans votre [question précédente sans réponse] (https://stackoverflow.com/questions/44279125/add-selected-data-from-jtable-to-lst-file), mais que vous n'avez jamais fourni un (juste comme vous ne le faites pas ici). S'il vous plaît ne pas ignorer ces demandes si vous voulez une réponse décente à vos questions. Nous demandons cette information pour une raison - afin que nous puissions comprendre votre code, votre problème et votre question. –

Répondre

3

Désolé d'être franc, mais votre tentative pour attraper NPE catch(NullPointerException n){} - est vraiment très fausse - ne jamais le faire, mais plutôt réparer les bogues qui pourraient causer le NPE à se produire. En ce qui concerne votre problème, vous ne surchargez pas la méthode actuelle. Votre signature de la méthode:

public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

ne correspond pas à la signature de la méthode actuelle:

public Component prepareRenderer(TableCellRenderer renderer, 
          int row, 
          int column) 

selon le JTable API, vous manquez le 3ème paramètre, le paramètre colonne int.

C'est pourquoi vous devez toujours préfixer les méthodes surchargées avec l'annotation @Override. Si vous aviez fait cela:

@Override // this will cause the compiler to complain that this isn't an override 
public Component prepareRenderer(TableCellRenderer renderer, int rowIndex) 

Et votre boucle dans cette méthode semble tout à fait suspect. Je m'en débarrasserais puisque le moteur de rendu ne restitue que la cellule spécifiée par les index de ligne et de colonne.

par exemple,

DefaultTableModel listModel = new DefaultTableModel(); 
JTable table1 = new JTable(listModel){ 

    @Override // don't forget this! 
    public Component prepareRenderer(TableCellRenderer renderer, int rowIndex, int columnIndex) { 
     JComponent component = (JComponent) super.prepareRenderer(renderer, i, columnIndex); 
     int lastRow = listModel.getRowCount(); 
     // this will likely set the whole row. If you only want to set only a specific cell, then 
     // you'll need to first check the columnIndex. 
     if (getValueAt(rowIndex, 6).toString().contains("yellow")) { 
      component.setBackground(Color.RED); 
     } else { 
      component.setBackground(null); // turn color back to default 
     } 
     return component; 
    } 
}; 
3

Vous ne devriez pas étendre JTable mais DefaultTableCellRenderer et définir que comme moteur de rendu par défaut dans votre tableau:

public class TableRendererExample { 
    public static void main(String[] args) { 
     TableCellRenderer renderer = new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
        boolean hasFocus, int row, int column) { 
       Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       rendererComponent.setBackground("value2".equals(value)?Color.RED:Color.WHITE); 
       return rendererComponent; 
      } 
     }; 
     TableModel tableModel= new DefaultTableModel(10, 3){ 
      @Override 
      public Object getValueAt(int arg0, int arg1) { 
       return "value"+new Random().nextInt(4); 
      }  
     }; 
     JTable jTable = new JTable(tableModel); 
     jTable.setDefaultRenderer(Object.class, renderer); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
} 


probable que ce soit un meilleure solution à long terme car elle permet également à l'OP pour définir le rendu de cellule pour une colonne spécifique. - Hovercraft Full Of Eels

Mieux encore, vous n'avez pas besoin de connaître l'indice de colonne à l'avance quand vous écrasez getColumnClass() dans TableModel:

même classe Renderer pour toutes les colonnes:

class DefaultTableCellRendererBackground extends DefaultTableCellRenderer { 
    private final Color highlightColor; 

    DefaultTableCellRendererBackground(Color highlightColor) { 
     this.highlightColor = highlightColor; 
    } 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
      int row, int column) { 
     Component rendererComponent = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, 
       column); 
     rendererComponent.setBackground(highlightColor); 
     return rendererComponent; 
    } 
} 

TableModel renvoyant différentes ColumnClasses à chaque exécution:

final class DefaultTableModelExtension extends DefaultTableModel { 
    private final List<Class<?>> columnClass; 

    DefaultTableModelExtension(int rowCount, int columnCount, List<Class<?>> columnClass) { 
     super(rowCount, columnCount); 
     this.columnClass = columnClass; 
     Collections.shuffle(this.columnClass); 
    } 

    @Override 
    public Class<?> getColumnClass(int col) { 
     return columnClass.get(col); 
    } 

    @Override 
    public Object getValueAt(int arg0, int arg1) { 
     return "value" + new Random().nextInt(4); 
    } 
} 

Types t o être retourné:

interface TagRed {} 

interface TagBlue {} 

interface TagYellow {} 

utilisation (plusieurs fois Trajets ...):

public class TableRendererExample { 
    public static void main(String[] args) { 
     JTable jTable = new JTable(); 
     jTable.setDefaultRenderer(TagRed.class, new DefaultTableCellRendererBackground(Color.RED)); 
     jTable.setDefaultRenderer(TagBlue.class, new DefaultTableCellRendererBackground(Color.BLUE)); 
     jTable.setDefaultRenderer(TagYellow.class, new DefaultTableCellRendererBackground(Color.YELLOW)); 

     List<Class<?>> columnClass = Arrays.asList(TagRed.class, String.class, TagBlue.class, TagRed.class, String.class, 
       TagYellow.class, TagBlue.class); 
     jTable.setModel(new DefaultTableModelExtension(10, columnClass.size(), columnClass)); 
     JOptionPane.showMessageDialog(null, jTable); 
    } 
}