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

AWT/Swing Java Discussion :

[cellRenderer] problème de focus


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut [cellRenderer] problème de focus
    Salut,

    j'ai un petit souci, j'ai fait un cellRenderer qui ne fonctionne pas comme je le veux j'ai dû faire une erreur quelque part mais je ne vois pas où, du coup je suis allé voir des tutos et la javadoc mais j'ai pas trouvé de solution.
    Pourtant mon code est ultra simple.

    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 Montant_CellRenderer  extends DefaultTableCellRenderer {
    	 public Component getTableCellRendererComponent(JTable table,
    	 Object value,
    	 boolean isSelected,
    	 boolean hasFocus,
    	 int row,
    	 int column){
     
    		 setHorizontalAlignment(SwingConstants.RIGHT);
     
    		 BigDecimal bdMtt = ActionUtils.parsetoBigDecimal(value);
     
    		 setText(value.toString());
     
    		 if (bdMtt.signum() < 0){
    			 setForeground(Color.red);
    		 }else{
    			 setForeground(Color.black);
    		 }
     
    	 return this;
    	 }
    }
    Ce qu'il fait : si le montant est négatif la couleur est rouge seulement quand on sélectionne la cellule.
    Du coup j'ai essayé avec les hasFocus et isSelected dans mon if mais au lieu de n'afficher la valeur en rouge quand il est selectionné il affiche tout le temps en noir.


  2. #2
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    personne ne sait???


  3. #3
    Membre averti
    Profil pro
    Developpeur
    Inscrit en
    Novembre 2004
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 12
    Par défaut
    Et si tu appelais la méthode super() ?

    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
     
    class Montant_CellRenderer extends DefaultTableCellRenderer {
    	public Component getTableCellRendererComponent(JTable table, Object value,
    			boolean isSelected, boolean hasFocus, int row, int column) {
    		super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    		setHorizontalAlignment(SwingConstants.RIGHT);
    		BigDecimal bdMtt = ActionUtils.parsetoBigDecimal(value);
    		setText(value.toString());
    		if (bdMtt.signum() < 0) {
    			setForeground(Color.red);
    		} else {
    			setForeground(Color.black);
    		}
    		return this;
    	}
    }

  4. #4
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    ca change rien... le contenu de la cellule est rouge seulement si la cellule est sélectionnée, comme avant.

    Merci pour cette réponse je commencais à désepérer.

  5. #5
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Salut,

    Si j'ai bien compris ton problème, tu veux afficher la cellule en rouge si, quand elle est sélectionné, le montant est négatif.
    Petit exemple explicatif de ce que j'ai compris:
    Cell1 a un montant négatif
    Cell1 est en noir au début --> sélection de Cell1 --> Cell1 passe en rouge
    sélection de Cell2 --> Cell1 passe en noir

    C'est ça?

  6. #6
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Non je veux afficher la cellule en rouge si le montant est négatif, que la cellule soit sélectionnée ou pas. Bref tout le temps rouge si montant < 0.

    Mon problème c'est que ca affiche en rouge seulement quand je sélectionne.

    Si je reprends ton exemple.

    Ce que je veux :

    Cell1 est négatif --> cell 1 est en rouge.

    Ce que j'ai déjà et que je ne veux pas avoir :

    Cell1 a un montant négatif
    Cell1 est en noir au début --> sélection de Cell1 --> Cell1 passe en rouge
    sélection de Cell2 --> Cell1 passe en noir

  7. #7
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Ok.
    C'est toi qui rentres les valeurs des Cell où c'est l'utilisateur?

    Tu peux poster ce code?

  8. #8
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    Ok.
    C'est toi qui rentres les valeurs des Cell où c'est l'utilisateur?
    L'utilisateur

    Tu peux poster ce code?
    Le code pour le cellEditor est au dessus en ce qui concerne la table :
    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
     
    JXTable tableDetail = new JXTable(new SaisieAchatTableModel(ecrituresType));
     
    		tableDetail.getTableHeader().setReorderingAllowed(false);
    		final JScrollPane scrollPane = new JScrollPane(tableDetail);
    		tableDetail.setPreferredScrollableViewportSize(new Dimension(600, 100));
    		final GBC affTableDetail = new GBC(0,7,6,1).setInsets(10,0,0,0).setAnchor(GBC.CENTER);
    		//pour aligner certaines colonnes à droite
    		DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    		renderer.setHorizontalAlignment(SwingConstants.RIGHT);
    		//pour aligner à droite et afficher en rouge si négatif
    		MontantCellRenderer montantRenderer = new MontantCellRenderer();
    		//applique le renderer aux colonnes		
    		tableDetail.getColumnModel().getColumn(SaisieAchatTableModel.MONTANT_COL).setCellRenderer(montantRenderer);
    tableDetail.getColumnModel().getColumn(SaisieAchatTableModel.QTE_COL).setCellRenderer(renderer);
    ...
    Je construis une Jxtable toute bête avec un model, j'applique le cellrenderer dont tu as le code au dessus. J'ai vérifié je n'applique pas deux cellRenderer sur la même colonne (ca peux m'arriver des fois je suis fatigué), et je n'ai pas de renderer sur la table, rien qui fasse doublon avec le cellRenderer qui affiche en rouge.

  9. #9
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    T'as essayé de faire un CellEditorListener et dans la méthode editingStopped() tu vérifies si le chiffre rentré est négatif, puis tu mets la cellule à rouge.

  10. #10
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    J'ai cherché un peu mais j'ai pas trouvé d'exemple, ca marche comment le CellEditorListener?

  11. #11
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Bah dans la classe où tu fais la saisie des cellules, tu implémentes CellEditorListener avec les méthodes qui vont bien : CellEditorListener
    Et dans la méthode editingStopped() (c'est à dire quand l'utilisateur a fini d'éditer la cellule) tu regardes si le montant est négatif et s'il l'est avec ton Renderer, tu passes la cellule à rouge..
    Sans garantie, c'est pas testé et ça reste théorique ^^
    Voilà

  12. #12
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    J'ai fait ca comme ca :
    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
     
     
    import java.awt.Color;
    import java.awt.Component;
    import java.math.BigDecimal;
     
    import javax.swing.JTable;
    import javax.swing.SwingConstants;
    import javax.swing.event.CellEditorListener;
    import javax.swing.event.ChangeEvent;
    import javax.swing.table.DefaultTableCellRenderer;
     
     @SuppressWarnings("serial") public class MontantCellRenderer extends DefaultTableCellRenderer implements CellEditorListener{
     
    	 BigDecimal bdMtt = new BigDecimal(0);
     
    	 public Component getTableCellRendererComponent(JTable table,
    	 Object value,
    	 boolean isSelected,
    	 boolean hasFocus,
    	 int row,
    	 int column){
    		 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    		 setHorizontalAlignment(SwingConstants.RIGHT);
     
    		 BigDecimal bdMtt = ActionUtils.parsetoBigDecimal(value);
     
    		 setText(value.toString());
     
    		 this.bdMtt = bdMtt;
     
    	 return this;
    	 }
     
    	public void editingCanceled(ChangeEvent arg0) {
     
    	}
     
    	public void editingStopped(ChangeEvent arg0) {
    		if (bdMtt.signum() < 0){
    			 setForeground(Color.red);
    		 }else{
    			 setForeground(Color.black);
    		 }		
    	}
    }
    Ca fait rien!!!!!!!
    [EDIT]
    Ca fait rien = montant positif ou négatif ca reste noir d'ailleurs et si je mets un system.out.println il n'affiche rien.

    Dans la version actuelle (code tout en haut) si je rajoutais un system.out.println et qu'une cellule avait un montant <0 il affichait mais la couleur reste noir sauf si on sélectionne la cellule (sélectionne pas édite).
    [/EDIT]

  13. #13
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Par défaut
    J'ai trouvé la réponse la : http://java.sun.com/docs/books/tutor...rRenderer.java

    j'ai rajouté cette ligne là au commentaire très explicite, et maintenant ca fonctionne.
    setOpaque(true); //MUST do this for background to show up.
    Merci à Gueritarish et mikemikemike pour votre aide.

    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 MontantCellRenderer extends JLabel implements TableCellRenderer {
     
    	 public MontantCellRenderer(){
    	        setOpaque(true); //MUST do this for background to show up.
    	 }
     
    	 BigDecimal bdMtt = new BigDecimal(0);
     
    	 public Component getTableCellRendererComponent(JTable table,
    	 Object value,
    	 boolean isSelected,
    	 boolean hasFocus,
    	 int row,
    	 int column){
     
    		 setHorizontalAlignment(SwingConstants.RIGHT);
     
    		 BigDecimal bdMtt = ActionUtils.parsetoBigDecimal(value);
     
    		 setText(value.toString());
     
    		 if (bdMtt.signum() < 0){
    			 setForeground(Color.red);
    		 }else{
    			 setForeground(Color.black);
    		 }
    	 return this;
    	 }
    }

  14. #14
    Membre Expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Par défaut
    Mais c'est avec plaisir si j'ai pu t'aider ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de focus avec une TTreeView
    Par Rustine dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/10/2005, 18h12
  2. Problème de Focus
    Par Charette dans le forum Composants VCL
    Réponses: 7
    Dernier message: 14/09/2005, 23h18
  3. problème de focus dans un CEdit
    Par Depteam1 dans le forum MFC
    Réponses: 11
    Dernier message: 08/09/2005, 15h05
  4. [JTextField] Problème de focus
    Par clairette dans le forum Composants
    Réponses: 29
    Dernier message: 22/07/2005, 16h52
  5. Problème de focus + touches de direction
    Par schnito dans le forum Agents de placement/Fenêtres
    Réponses: 9
    Dernier message: 11/01/2005, 20h13

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