Afficher valeur en couleur dans un JTable à partir d'un fichier

Résolu
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008 - 9 févr. 2008 à 00:20
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre 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

12 réponses

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 févr. 2008 à 20:42
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 ...
3
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 févr. 2008 à 12:25
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());
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
9 févr. 2008 à 17:56
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
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 févr. 2008 à 19:44
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 ...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
9 févr. 2008 à 20:00
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 ...
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
9 févr. 2008 à 20:29
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);
            
    }
}
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 févr. 2008 à 11:42
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);
}
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
10 févr. 2008 à 13:19
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
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
10 févr. 2008 à 18:45
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);
            
    }
}
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
10 févr. 2008 à 18:55
Dans la classe CustomTableCellRenderer remplacer:
  if( amount.equals("?"))  par   if( amount.equals("20"))  //c'est pas l'erreur mais just faute de frappe 
0
noussa1985 Messages postés 31 Date d'inscription jeudi 14 juin 2007 Statut Membre Dernière intervention 20 avril 2008
10 févr. 2008 à 23:04
Salem,
c'est bon ça marche
Merci biennnn pour votre aide et desolé pour le dérangement.
bonne nuit
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
11 févr. 2008 à 00:06
Salut:

Mais quel dérrangement?

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

Bonne chance ...
0
Rejoignez-nous