Afficher valeur en couleur dans un JTable à partir d'un fichier [Résolu]

Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
- - Dernière réponse : Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
- 11 févr. 2008 à 00:06
Bonsoir à tous,
SVP j'ai besoin de votre aide,
dans mon programme j'essai d'afficher  des  valeures trouvant dans un fichier sur un JTable.Jarrive à faire l'affichage mais le probleme est je dois afficher toutes les valeures portant le nombre 20(val=20) du fichier en couleures rouge dans mon JTable.
Est ce que quelcun a une aide???
SVP aidez moi
Bonne nuit
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
3
Merci
Salut:

D'aprés ce que je viens de comprendre tu veux colorer toutes les cellules ayant la valeur 20 et cette valeur peut apparaître dans différentes colonnes.

Il suffit de procéder ainsi:

// La classe CustomTableCellRenderer
public class CustomTableCellRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                                                     boolean isSelected, boolean hasFocus, int row, int column)  {
        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (value.toString().equals("20")) {
            cell.setForeground(Color.RED);
        } else {
            cell.setForeground(Color.BLUE);
        }
        return cell;
    }
}

// La classe Affichage
public class Affichage extends JFrame {
    public void initComponents() {
       // ...
       JTable table = new JTable(model);
       table.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
      
        // ...
    }
}

Cordialement ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut:

Il faut définir un TableCellRenderer pour la colonne en question:

public class CustomCellRenderer implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                                                    boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = new JLabel();
            if ((Integer)value <= 20) {
                label.setText("<html>" +
                                        "" + value + "" +
                                   "</html>");
            } else {
                label.setText("<html>" +
                                        "" + value + "" +
                                    "</html>");
            }
            return label;
    }
}

JTable table = new JTable(...);
// Il faut changer "Colonne" par le nom de la colonne en question
table.getColumn("Colonne").setCellRenderer(new CustomCellRenderer());
Commenter la réponse de Ombitious_Developper
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
Merci bien pour votre aide mais je suis debutante en java et je connait pas la classe TableCellRenderer,c'est quoi  son utilité?c'est quoi la relation entre elle et la classe JTable?en  + vous avez defini la methode getTableCellRendererComponent sans l'avoir utilisé.
Je veux ajouter quelque chose :je connait pas ou  est ce  que la  variable (var=20)va etre placé dans mon JTable.
Merci bien de vouloir me repondre
Commenter la réponse de noussa1985
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut:

1. L'interface TableCellRenderer est nécessaire pour définir comment on affiche le contenu d'une cellule d'un objet JTable.

2. Il faut implémenter cette interface pour colorer le texte d'une cellule d'un objet JTable et faire beaucoup d'autre choses comme l'affichage d'une image, ...

3. C'est ce que je viens de faire: CustomTableCellRenderer implémente cette interface qui contient une seule méthode getTableCellRendererComponent()

4. Autres questions?

Cordialement ...
Commenter la réponse de Ombitious_Developper
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut:

Est ce que tu peux nous fournir la partie du code où tu déclare ton objet JTable y compris la déclaration des données et des noms des colonnes de la table.

Cordialement ...
Commenter la réponse de Ombitious_Developper
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
RQ:le fichier est ss forme de tableau de val
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Affichage extends JFrame{

    public String path;
    JPanel p=new JPanel();
    public DefaultTableModel model;
       
        public Affichage(String path){
           
            this.path=path;
            initComponents();
        }
       
        public void initComponents(){
          
            model = new DefaultTableModel();
           int nb =getNbAttribut();
            for(int i = 0; i < nb; i++)//on place les titres
                model.addColumn("A"+(i+1));
            try {
                readFile(model);//lecture du fichier
            } catch (Exception e) {
                e.printStackTrace();
            }
           
            setContentPane(new JScrollPane(new JTable(model)));  // Mon JTable
            setSize(500, 400);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
          
        }
    /********** Methode qui le fichier par tokens et les met ds un vecteur ***********/

        public void readFile(DefaultTableModel model) throws Exception{
            Scanner sc = new Scanner(new FileInputStream(path));   //on ouvre le fichier pour le lire
            while(sc.hasNext()){       //tant qu'il y a des choses à lire
                StringTokenizer token = new StringTokenizer(sc.nextLine(), " ");
                Vector<String> rowData = new Vector<String>();
                while(token.hasMoreTokens())  //lecture des token et on les mets dans le vecteur
                    rowData.add(token.nextToken());
                model.addRow(rowData);//on ajoute la ligne
            }
            sc.close();
        }
      
    /**********Methode qui retourne le nbre de ligne ds le fichier***********/
    public int getNbLine(){
        int cpt=0;
        try {
           
            FileReader reader=new FileReader(path);
            Scanner in=new Scanner(reader);
            while(in.hasNextLine()){
                    cpt++;
            }
                   
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return cpt;
}
       /**********Methode qui retourne le nbre de colonnes ds le fichier***********/
    public int getNbAttribut(){
        int nb=0;
        try {
            FileReader reader=new FileReader(path);
            Scanner in=new Scanner(reader);
            String st=in.nextLine();
            StringTokenizer s=new StringTokenizer(st," ");           
                nb=s.countTokens();
               
                       
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
       
        return nb;
    }
     
    public void affichTab(int tab[]){
   
        for(int i=0;i<tab.length;i++){
            System.out.println(tab[i]);
        }
    }
    public static void main(String[] args){
       
        Affichage a=new Affichage("in");
        a.setVisible(true);
            
    }
}
Commenter la réponse de noussa1985
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut Bent Bladi:

Le code source que tu as fournit ne précise pas quelle colonne contient des données numériques.

Le code que je t'ai posté est simple à intégrer:

1. Tu crées une nouvelle classe pour CustomTableCellRenderer.

2. Tu identifies le nom de la colonne qui contient les données numériques que tu veux colorer, par exemple si c'est A2 tu procéde ainsi:

// A modifier
public void initComponents(){
      model = new DefaultTableModel();
      int nb =getNbAttribut();
      for(int i = 0; i < nb; i++)//on place les titres
          model.addColumn("A"+(i+1));
          try {
              readFile(model);//lecture du fichier
          } catch (Exception e) {
                e.printStackTrace();
          }
           
          //setContentPane(new JScrollPane(new JTable(model)));  // Mon JTable
          JTable table = new JTable(model);
          // Comme je ne connais pas la colonne qui contient des données numériques
          // Je vais supposer que c'est la colonne ayant le nom "A2"
          // A toi de le corriger si mon intuition m' a trompé.
          table.getColumn("A2").setCellRenderer(new CustomTableCellRenderer());  
          getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

          setSize(500, 400);
          setLocationRelativeTo(null);
          setDefaultCloseOperation(EXIT_ON_CLOSE);
}
Commenter la réponse de Ombitious_Developper
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
St Weld Bladi:
Merci bien pour votre aide mon pbl est que je connait pas ds quelle colonne(s) ni ds quel cellule la val va etre placée.
En tout ca merci bien,j'ai  au  moin maintenant une idée comment utiliser TableCellRenderer je vais essayer tte seule
Bonne journée
Commenter la réponse de noussa1985
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
St weld bladi etes vous encore là?
j'ai pensé que j'ai trouvé le solution mais malheureusement tjrs à l'affichage la val 20 n'est pas coloré en rouge.
SVP aidez moi c'est trop urgent.



mon fichier sous la forme de :  a b 2  20
                                              1 4 7 5
                                             20 1 v 7








Classe




CustomTableCellRenderer




Ajoutée:






import java.awt.Component;
import java.awt.Color;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;















public class CustomTableCellRenderer extends DefaultTableCellRenderer
{
    public Component getTableCellRendererComponent(JTable table, Object value,
                     boolean isSelected,boolean hasFocus, int row, int column)
    {
        Component cell = super.getTableCellRendererComponent
  

         (table, value, isSelected, hasFocus, row, column);
        if( value instanceof String )
        {
            String amount = (String) value;
            if( amount.equals("?"))
            {
               // cell.setBackground( Color.red );
                // You can also customize the Font and Foreground this way
                 cell.setForeground(Color.red);
               // cell.setFont();
               }
            else
            {
                cell.setForeground( Color.blue );
            }
        }
        return cell;
    }
}












// Classe  Affichage:











import java.awt.BorderLayout;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class Affichage extends JFrame{

    public String path;
    JPanel p =new JPanel();
    public DefaultTableModel model;
       
        public Affichage(String path){
           
            this.path= path;
            initComponents();
        }
       
        public void initComponents(){
          
            model = new DefaultTableModel();
           int nb =getNbAttribut();
            for(int i = 0; i < nb; i++)//on place les titres
                model.addColumn("A"+(i+1));
            try {
                readFile(model);//lecture du fichier
            } catch (Exception e) {
                e.printStackTrace();
            }
     // Partie Ajoutée:
             JTable table =new JTable(model);
            TableCellRenderer renderer = new CustomTableCellRenderer();
       try
        {
            table.setDefaultRenderer( Class.forName   //Sets a default cell renderer to be used if no
               ( "java.lang.String" ), renderer );               //renderer has been set in a TableColumn
        }
        catch( ClassNotFoundException ex )
        {
           // System.exit( 0 );
            System.out.println("erreur");
        }
    
              getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
             setSize(500, 400);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
          
        }
    /********** Methode qui le fichier par tokens et les met ds un vecteur ***********/

        public void readFile(DefaultTableModel model) throws Exception{
            Scanner sc = new Scanner(new FileInputStream(path));   //on ouvre le fichier pour le lire
            while(sc.hasNext()){       //tant qu'il y a des choses à lire
                StringTokenizer token = new StringTokenizer(sc.nextLine(), " ");
                Vector<String> rowData = new Vector<String>();
                while(token.hasMoreTokens())  //lecture des token et on les mets dans le vecteur
                    rowData.add(token.nextToken());
                model.addRow(rowData);//on ajoute la ligne
            }
            sc.close();
        }
      
    /**********Methode qui retourne le nbre de ligne ds le fichier***********/
    public int getNbLine(){
        int cpt=0;
        try {
           
            FileReader reader=new FileReader(path);
            Scanner in=new Scanner(reader);
            while(in.hasNextLine()){
                    cpt++;
            }
                   
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return cpt;
}
       /**********Methode qui retourne le nbre de colonnes ds le fichier***********/
    public int getNbAttribut(){
        int nb=0;
        try {
            FileReader reader=new FileReader(path);
            Scanner in=new Scanner(reader);
            String st=in.nextLine();
            StringTokenizer s=new StringTokenizer(st," ");           
                nb=s.countTokens();
               
                       
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
       
        return nb;
    }
     
    public void affichTab(int tab[]){
   
        for(int i=0;i<tab.length;i++){
            System.out.println(tab[i]);
        }
    }
    public static void main(String[] args){
       
        Affichage a=new Affichage("in");
        a.setVisible(true);
            
    }
}
Commenter la réponse de noussa1985
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
Dans la classe CustomTableCellRenderer remplacer:
  if( amount.equals("?"))  par   if( amount.equals("20"))  //c'est pas l'erreur mais just faute de frappe 
Commenter la réponse de noussa1985
Messages postés
31
Date d'inscription
jeudi 14 juin 2007
Dernière intervention
20 avril 2008
0
Merci
Salem,
c'est bon ça marche
Merci biennnn pour votre aide et desolé pour le dérangement.
bonne nuit
Commenter la réponse de noussa1985
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut:

Mais quel dérrangement?

J'ai appris pas mal de choses grâce à toi.

Bonne chance ...
Commenter la réponse de Ombitious_Developper

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.