IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

Probleme avec le Renderer d'une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut Probleme avec le Renderer d'une JTable
    Salut,

    J'essaie d'implémenter le système de rendu pour ma JTable mais à vrai dire, ça ne marche pas du tout !...
    En fait, c'est tout simple, le rendu qu'il devrait y avoir n'a pas lieu ...

    Voici le code de la classe où est créé la JTable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    public class PanelPret extends JPanel implements Observer{
     
    	private JTable jTable = null;	
    	TablePretModel tpm = null;
     
    .....
     
    	private JTable getJTable() {
    		if (jTable == null) {			
    			tpm = new TablePretModel();
    			jTable = new JTable(tpm);
    			jTable.setShowGrid(true);
    			jTable.setColumnSelectionAllowed(false);
    			jTable.setRowSelectionAllowed(true);
    			jTable.setSelectionForeground(new Color(0, 102, 153));
    			jTable.setSelectionBackground(new Color(255, 255, 204));
    			jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			jTable.setDefaultRenderer(tpm.getClass(),new CellRenderer());
    		}
    		return jTable;
    	}
     
    .....
     
    }
    Voici le code avec le modèle pour la JTable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public class TablePretModel extends AbstractTableModel{
     
    	private static final long serialVersionUID = -8435807783031696373L;
    	private SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy",Locale.US);
    	private String[] header = {"Id Pret","Trader","Contrepartie","Sicav","Compartiment",
    			"Titre","Quantité","Date_Début","Date_Fin","Statut","Statut_Retour"};
    	private Object[][] contenu = {
    			{new Integer(1),"aaa","C1","Belgacom","Cpt1","Belga",new Integer(100),
    				sdf.format(new GregorianCalendar(2007,Calendar.MAY,10).getTime()),
    				sdf.format(new GregorianCalendar(2007,Calendar.DECEMBER,10).getTime()),"ND","ND"},
    			{new Integer(2),"bbb","C2","Belgacom","Cpt2","Belga",new Integer(3000),
    				sdf.format(new GregorianCalendar(2007,Calendar.JULY,15).getTime()),
    				sdf.format(new GregorianCalendar(2008,Calendar.JULY,15).getTime()),"ND","ND"}
    			};
     
    	public int getColumnCount() {		
    		return header.length;
    	}
     
    	public int getRowCount() {	
    		return contenu.length;
    	}
     
    	public Object getValueAt(int row, int col) {		
    		return contenu[row][col];
    	}
     
    	public String getColumnName(int col) {
            return header[col];
        }
     
    	public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
     
    	public boolean isCellEditable(int row, int col) {        
            if (col < 9) {
                return false;
            } else {
                return true;
            }
        }
     
    	public void setValueAt(Object value, int row, int col) {
            contenu[row][col] = value;
            fireTableCellUpdated(row, col);       
        }
    }
    Et voici le code pour le Renderer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class CellRenderer extends JLabel implements TableCellRenderer{
     
    	private static final long serialVersionUID = -6348693518838532834L;
     
    	public CellRenderer(){
    		super();
    		setOpaque(true);
    	}
     
    	public Component getTableCellRendererComponent(JTable jTable, Object value, 
    			boolean isSelected, boolean hasFocus, int row, int col) {				
    		if (hasFocus()){
    			setBackground(Color.ORANGE);
    		}
    		if (isSelected){
    			setForeground(Color.MAGENTA);
    		}			
    		return this;
    	}
    }

    Si vous voyez pourquoi ça coince, merci de faire signe

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout à fait normal, tu essaie d'affecter ton renderer à TableModel, or les cellules de la JTable ne contiennent pas de TableModel.

    Dans ton cas Tu dois affecter à un type d'objet contenu dans ta JTable, si tu veux que ce soit appliqué à tous les objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maTable.setDefaultCellRenderer(Object.class,new MonRenderer());

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Citation Envoyé par sinok
    Tout à fait normal, tu essaie d'affecter ton renderer à TableModel, or les cellules de la JTable ne contiennent pas de TableModel.

    Dans ton cas Tu dois affecter à un type d'objet contenu dans ta JTable, si tu veux que ce soit appliqué à tous les objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maTable.setDefaultCellRenderer(Object.class,new MonRenderer());
    Merci d'avoir répondu !

    Mais j'ai déjà essayé avec Object.class; mais comme je tourne en rond, je finis par mettre n'importe quoi ...
    Et dans le cas où je mets Object.class, je n'ai plus que les cellules avec des champs Integer qui se remplissent (pour les autres, les données ne s'affichent pas !).
    D'autre part, avec Object.class, le rendu ne fonctionne pas davantage ...


  4. #4
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut
    et si tu mettais un test dans le renderer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class CellRenderer extends JLabel implements TableCellRenderer{
     
    	private static final long serialVersionUID = -6348693518838532834L;
     
    	public CellRenderer(){
    		super();
    		setOpaque(true);
    	}
     
    	public Component getTableCellRendererComponent(JTable jTable, Object value, 
    			boolean isSelected, boolean hasFocus, int row, int col) {				
                    if (col==1)&&(col==5) // je suis pas sur des numeros
                    {
    		if (hasFocus()){
    			setBackground(Color.ORANGE);
    		}
    		if (isSelected){
    			setForeground(Color.MAGENTA);
    		}		
    }	
    		return this;
    	}
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Merci aussi à toi !

    Mais en fait, je suis reparti dans une autre direction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    public class PanelPret extends JPanel implements Observer{
     
    	private static final long serialVersionUID = -8838362089022553809L;
    	private JTable jTable = null;	
    	TablePretModel tpm = null;
     
    	.....
     
    	private JTable getJTable() {
    		if (jTable == null) {
    			tpm = new TablePretModel();
    			jTable = new JTable(tpm);
    			jTable.setShowGrid(true);
    			jTable.setColumnSelectionAllowed(false);
    			jTable.setRowSelectionAllowed(true);
    			jTable.setSelectionForeground(new Color(0, 102, 153));
    			jTable.setSelectionBackground(new Color(255, 255, 204));
    			jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    			jTable.setColumnSelectionAllowed(false);
    	//		jTable.setRowSelectionAllowed(false);
    			jTable.setDefaultRenderer(String.class,new CellRenderer());
    			jTable.setDefaultRenderer(Integer.class,new CellRenderer());
    			jTable.setDefaultRenderer(GregorianCalendar.class,new CellRenderer());
    		}
    		return jTable;
    	}	
     
    .....
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public class TablePretModel extends AbstractTableModel{
     
    	private static final long serialVersionUID = -8435807783031696373L;
    	private SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy",Locale.US);
    	private String[] header = {"Id Pret","Trader","Contrepartie","Sicav","Compartiment",
    			"Titre","Quantité","Date_Début","Date_Fin","Statut","Statut_Retour"};
    	private Object[][] contenu = {
    			{new Integer(1),"aaa","C1","Belgacom","Cpt1","Belga",new Integer(100),
    				sdf.format(new GregorianCalendar(2007,Calendar.MAY,10).getTime()),
    				sdf.format(new GregorianCalendar(2007,Calendar.DECEMBER,10).getTime()),"ND","ND"},
    			{new Integer(2),"bbb","C2","Belgacom","Cpt2","Belga",new Integer(3000),
    				sdf.format(new GregorianCalendar(2007,Calendar.JULY,15).getTime()),
    				sdf.format(new GregorianCalendar(2008,Calendar.JULY,15).getTime()),"ND","ND"}
    			};
     
    	public int getColumnCount() {
    		return header.length;
    	}
     
    	public int getRowCount() {
    		return contenu.length;
    	}
     
    	public Object getValueAt(int row, int col) {
    		return contenu[row][col];
    	}
     
    	public String getColumnName(int col) {
            return header[col];
        }
     
    	public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
     
    	public boolean isCellEditable(int row, int col) {
            if (col < 9) {
                return false;
            } else {
                return true;
            }
        }
     
    	public void setValueAt(Object value, int row, int col) {
            contenu[row][col] = value;
            fireTableCellUpdated(row, col);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class CellRenderer extends DefaultTableCellRenderer{
     
    	private static final long serialVersionUID = -6348693518838532834L;
     
    	public Component getTableCellRendererComponent(JTable jTable, Object value, 
    			boolean isSelected, boolean hasFocus, int row, int col) {
    		Component result = super.getTableCellRendererComponent(jTable, value,
    				isSelected, hasFocus, row, col);
    		setOpaque(true);		
    		if (isSelected) {
    		       setBackground(new Color(255,204,204));
    		       setForeground(Color.BLUE);
    		     } else {
    		    	 setBackground(new Color(238,238,238));
    		    	 setForeground(new Color(51,51,51));
    		     }			
    		return result;
    	}
    }
    Moi, mon but final, c'est que lorsque l'on clique sur une cellule, la ligne entière passe en surbrillance jaune et la cellule proprement dite passe en rose-saumon.

    Je sais que c'est au niveau de ces 2 instructions que ça doit se jouer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jTable.setSelectionBackground(new Color(255, 255, 204));
    jTable.setRowSelectionAllowed(false);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Ok, c'est trouvé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class CellRenderer extends DefaultTableCellRenderer{
     
    	private static final long serialVersionUID = -6348693518838532834L;
     
    	public Component getTableCellRendererComponent(JTable jTable, Object value, 
    			boolean isSelected, boolean hasFocus, int row, int col) {
    		Component result = super.getTableCellRendererComponent(jTable, value,
    				isSelected, hasFocus, row, col);
    		setOpaque(true);
     
    		if (isSelected) {
    		       setBackground(new Color(255, 255, 204));
    		       if (hasFocus){
    		    	   setBackground(new Color(255,204,204));
    		    	   setForeground(Color.BLUE);
    		       }
    		     } else {
    		    	 setBackground(new Color(238,238,238));
    		    	 setForeground(new Color(51,51,51));
    		     }			
    		return result;
    	}
    }

Discussions similaires

  1. probleme avec un JComboBox et une JTable
    Par claire13 dans le forum Composants
    Réponses: 8
    Dernier message: 25/04/2008, 15h29
  2. probleme avec des calculs et une requete de mise a jour
    Par el_quincho dans le forum Access
    Réponses: 2
    Dernier message: 16/03/2006, 10h06
  3. probleme avec l'affichage d'une de mes variables
    Par somatino dans le forum Langage
    Réponses: 12
    Dernier message: 02/03/2006, 15h39
  4. Réponses: 3
    Dernier message: 22/11/2005, 20h42
  5. Réponses: 2
    Dernier message: 10/10/2005, 02h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo