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 :

Problème d'actualisation d'une JTable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut Problème d'actualisation d'une JTable
    Bonjour,

    Voilà, j'ai un problème d'actualisation dans un JTable...
    Je m'explique :
    J'ai une JTable qui possède un cell editor, un renderer et un model (les trois compris dans une seule et unique classe !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    getTable().setCellEditor(getCtrTableHonoraireMedecin());
    getTable().setDefaultEditor(Object.class, getCtrTableHonoraireMedecin());
    getTable().setDefaultRenderer(Object.class, getCtrTableHonoraireMedecin());
    getTable().setModel(getCtrTableHonoraireMedecin());
    Dans ce CtrTableHonoraireMedecin, j'ai redéfinie les méthodes standards pour avoir un affichage personnalisé avec des labels et des listes.

    Là où ça se complique, c'est que pour pouvoir selectionner des élements dans la liste (pour pouvoir les supprimer ou modifier), j'ai dû rendre les champs de liste (de la table) éditables.
    En gros, ce qui se passe actuellement, c'est que lorsqu'on clique sur une des listes, elle est remplacée par une nouvelle qui est disponible en édition et sur laquelle on peut travailler (redéfinition des méthodes getTableCellEditorComponent(...) et getTableCellRendererComponent(...) ).


    Là où mon problème apparait, c'est lorsque je selectionne une colonne non éditable alors qu'une colonne éditable était préalablement selectionnée (une liste quoi).
    ==> Dans ce cas, ma liste en édition est rendue invisible (redéfinition du stopCellEditing() ) mais la case reste vide après celà... La valeur 'par défaut' n'est pas remise après le stopCellEditing().
    Par contre, si je selectionne une autre colonne éditable, le problème n'apparait pas.



    Si quelqu'un a rencontré le problème ou a une idée de la provenance de celui-ci, merci de me l'indiquer !
    Et en tout cas, merci d'avoir porté attention à mon problème !

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Déjà tu ne devrais pas mélanger le cell editor, le renderer et le model dans la même classe !!! A la rigueur le cell editor et le renderer cela pourrait aller même si je pense que c'est mieux de les séparer...

    Ensuite je te conseille de te baser sur les classes existantes (AbstractCellEditor/DefaultCellEditor, DefaultTableCellRenderer et AbstractTableModel/DefaultTableModel) qui propose déjà pas mal de fonctionnalité...


    Quand à ton problème exact... c'est dur de t'aider sans code... mais je suis presque sûr que le problème vient de ta "super-classe" qui fait tout

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    Merci pour ta réponse !

    Si tout est dans la même classe, c'est que j'ai suivi un principe qui était déjà utilisé dans l'application et en fait j'ai surtout repris et adapté le code qui avait déjà été fait.

    Ensuite je te conseille de te baser sur les classes existantes (AbstractCellEditor/DefaultCellEditor, DefaultTableCellRenderer et AbstractTableModel/DefaultTableModel) qui propose déjà pas mal de fonctionnalité...
    Pour les classes existantes, je me base déjà dessus. En effet, un grand nombre de classes ont étés implémentés pour 'faciliter' le codage des suivante et ainsi, il existe une classe CTRTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class CTRTable extends javax.swing.table.AbstractTableModel implements javax.swing.table.TableCellRenderer, TableCellEditor
    Ma classe étend donc celle-ci...

    Enfin, pour les exemples de code, je peux éventuellement en mettre, mais le problème, c'est que (comme je l'ai dis plus haut) j'utilise des classes redéfinies et j'ai peur que les noms ne vous parlent pas (auquel cas la masse de code à laisser serait impressionnante)...



    Je vais tout de même laisser cela :
    Voilà les colonnes de ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected final static int DATE_HONORAIRE = 0, BENEFICIAIRE = 1, ACTES = 2, MONTANT_HONORAIRE = 3, FSES = 4, REGLEMENTS = 5;
    Mes colonnes contenant des listes sont FSES et REGLEMENTS.

    Le isCellEditable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    public boolean isCellEditable(int row, int col)
    {
    	ligneSelected = row;
    	if ( col == FSES )
    		return true;
    	if ( col == REGLEMENTS )
    		return true;
     
    	return false;
    }
    Le getTableCellRendererComponent :
    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
    @Override
    public Component getTableCellRendererComponent(JTable jTable, Object value, boolean selected, boolean hasFocus, int row, int column)
    {
    	if (value instanceof METHonoraire)
    	{
    		METHonoraire honoraire = (METHonoraire) value;
    		switch (column)
    		{
    			case DATE_HONORAIRE :
    			{
    				...
    			}
    			case BENEFICIAIRE :
    			{
    				...
    			}
    			case ACTES :
    			{
    				...
    			}
    			case MONTANT_HONORAIRE :
    			{
    				...
    			}
    			case FSES :
    			{
    				IHMListeFseHonoraire retour = getListeFses(honoraire);
    				return retour;
    			}
    			case REGLEMENTS :
    			{
    				IHMListeReglementsHonoraire retour = getListeReglements(honoraire);
    				return retour;
    			}
    		}
    	}
    	return super.getTableCellRendererComponent(jTable, value, selected, hasFocus, row, column);
    }
    Le getTableCellEditorComponent :
    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
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
    {
    	METHonoraire honoraire = (METHonoraire) value;
    	if( column == FSES )
    	{
    		getListeFseEdition().setHonoraire(honoraire);
    		getListeFseEdition().actualiser();
    		getListeFseEdition().setVisible(true);
     
    		return getListeFseEdition();
    	}
    	if( column == REGLEMENTS )
    	{
    		getListeReglementEdition().setHonoraire(honoraire);
    		getListeReglementEdition().actualiser();
    		getListeReglementEdition().setVisible(true);
     
    		return getListeReglementEdition();
    	}
    	return super.getTableCellEditorComponent(table, value, isSelected, row, column);
    }

    Le stopCellEditing :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public boolean stopCellEditing()
    {
    	if ( getListeFseEdition().isVisible() )
    		getListeFseEdition().setVisible(false);
    	if ( getListeReglementEdition().isVisible() )
    		getListeReglementEdition().setVisible(false);
     
    	return true;
    }
    Getter de mes listes en édition :
    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
    50
    51
    52
    53
    54
    55
     
    private IHMListeReglementsHonoraire listeReglementEdition = null;
    private IHMListeFseHonoraire listeFseEdition = null;
     
    /**
     * Renvoie la liste des fse pour le mode édition. 
     */
    private IHMListeFseHonoraire getListeFseEdition() 
    {
    	if ( listeFseEdition == null )
    	{
    		listeFseEdition = new IHMListeFseHonoraire(null){
    			private final static long serialVersionUID = fr.crosstalk.infos.InfosCommun.serialVersionUID;
    				@Override
    			public void addNotify()
    			{
    				super.addNotify();
    				addEcouteurListeFseHonoraire(getEcouteur());
    			}
    				@Override
    			public void removeNotify()
    			{
    				super.removeNotify();
    				removeEcouteurListeFseHonoraire(getEcouteur());
    			}
    		};
    	}
    	return listeFseEdition;
    }
     
    /**
     * Renvoie la liste des règlements pour le mode édition. 
     */
    private IHMListeReglementsHonoraire getListeReglementEdition() 
    {
    	if ( listeReglementEdition == null )
    	{
    		listeReglementEdition = new IHMListeReglementsHonoraire(null){
    			private final static long serialVersionUID = fr.crosstalk.infos.InfosCommun.serialVersionUID;
    				@Override
    			public void addNotify()
    			{
    				super.addNotify();
    				addEcouteurListeReglementsHonoraire(getEcouteur());
    			}
    				@Override
    			public void removeNotify()
    			{
    				super.removeNotify();
    				removeEcouteurListeReglementsHonoraire(getEcouteur());
    			}
    		};
    	}
    	return listeReglementEdition;
    }

    Et Enfin les getters pour les liste en affichage :
    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
    private IHMListeReglementsHonoraire listeReglementEdition = null;
    private IHMListeFseHonoraire listeFseEdition = null;
     
    /**
     * Renvoie la liste de fse de l'honoraire en paramètres
     */
    private IHMListeFseHonoraire getListeFses(METHonoraire honoraire)
    {
    	if ( listeFses == null )
    		listeFses = new HashMap<METHonoraire, IHMListeFseHonoraire>();
     
    	if ( !listeFses.containsKey(honoraire) )
    	{
    		IHMListeFseHonoraire liste = new IHMListeFseHonoraire( honoraire );
    		listeFses.put(honoraire, liste);
    	}
     
    	return listeFses.get(honoraire);
    }
    /**
     * Renvoie la liste de reglements de l'honoraire en paramètres
     */
    private IHMListeReglementsHonoraire getListeReglements(METHonoraire honoraire)
    {
    	if ( listeReglements == null )
    		listeReglements = new HashMap<METHonoraire, IHMListeReglementsHonoraire>();
     
    	if ( !listeReglements.containsKey(honoraire) )
    	{
    		IHMListeReglementsHonoraire liste = new IHMListeReglementsHonoraire( honoraire );
    		listeReglements.put(honoraire, liste);
    	}
     
    	return listeReglements.get(honoraire);
    }

    Voilà pour le code...
    Merci d'avoir lu jusque là et de bien vouloir m'aider !

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par feasil
    Pour les classes existantes, je me base déjà dessus. En effet, un grand nombre de classes ont étés implémentés pour 'faciliter' le codage des suivante et ainsi, il existe une classe CTRTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class CTRTable extends javax.swing.table.AbstractTableModel implements javax.swing.table.TableCellRenderer, TableCellEditor
    Non : tu ne te bases que sur la classe AbstractTableModel !

    En implémentant les interfaces TableCellRenderer et TableCellEditor tu es obligé de réécrire toutes leurs méthodes... alors que cela n'aurait pas été le cas si tu avais hérité des classes Abstract/Default qui propose une implémentation de la plupart des méthodes...

    Par exemple, le premier problème que je vois, c'est que ta méthode stopCellEditing() cache le composant ! Or il se trouve que tu ne devrais pas faire cela car les cellules des tableaux ne sont pas des composants "standards". Je veux dire par là qu'il ne sont pas réellement ajouter à la JTable, mais que la JTable se contente de les afficher...

    La méthode stopCellEditing() devrait plutôt lancer un évènement si je ne me trompe pas...


    Bref il serait plus simple d'utiliser les implémentations existante plutôt que de recoder toutes les méthodes...




    Citation Envoyé par feasil
    Si tout est dans la même classe, c'est que j'ai suivi un principe qui était déjà utilisé dans l'application et en fait j'ai surtout repris et adapté le code qui avait déjà été fait.
    Oui mais pourquoi ? Je pense que le fait d'avoir une "grosse classe qui fait tout" est plus propice à augmenter le risque d'erreur...


    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    Citation Envoyé par adiGuba
    Je veux dire par là qu'il ne sont pas réellement ajouter à la JTable, mais que la JTable se contente de les afficher...
    Ca c'est interressant, je ne savais pas et ça explique certains bugs que j'ai eu...

    En tout cas merci, je vais chercher de ce côté là !

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

Discussions similaires

  1. Actualisation d'une JTable
    Par docv266 dans le forum Composants
    Réponses: 10
    Dernier message: 07/08/2007, 12h10
  2. Réponses: 1
    Dernier message: 25/06/2007, 16h33
  3. Réponses: 6
    Dernier message: 20/06/2006, 14h49
  4. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57
  5. [Jtable] problème de suppression dans une Jtable
    Par gianni17 dans le forum Composants
    Réponses: 1
    Dernier message: 02/12/2005, 18h36

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