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 :

CellEditor de date


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut CellEditor de date
    Bonjour,

    j'ai créé une JTable à laquelle j'associe à une des colonnes, une classe permettant l'édition de données sous forme de date.

    Voici cette classe:
    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
    private class C_EditionColonneDate extends DefaultCellEditor
    {
      private static final long serialVersionUID = 1L;
     
      public C_EditionColonneDate() {
        super( new JFormattedTextField( C_Projet.creeFormatMasque( "##/##/####" )));
      }
     
      public Component getTableCellEditorComponent( JTable jTbl, Object oVal, boolean yaselection, int l, int c ) {
        JFormattedTextField fTxtField = (JFormattedTextField)super.getTableCellEditorComponent( jTbl, oVal, yaselection, l, c );
     
        if( oVal != null )
          fTxtField.setText( oVal.toString());
     
        return fTxtField;
      }
    }
    C_Projet.creeFormatMasque est une classe servant à créer des objets MaskFormatter.

    Le problème rencontré est que lorsque j'entre dans une cellule de type date, rien n'est affiché dans celle-ci, et pourtant, il y a déjà le texte "0 / / ".
    Ce qui fait que dès que je tape "1", pour écrire par exemple "17/12/2012", la saisie est déjà "01/ / ". Il faut à chaque fois que je sélectionne l'ensemble pour tout effacer et commencer avec une saisie vierge.

    Pourtant, ce MaskFormatter fonctionne très bien lorsque je l'utilise par exemple dans un JTextField. Dans ce cas, le 1er caractère saisi s'incrit bien en 1er caractère du champ "1 / / ".

    Existe-t-il une solution à ce problème ?

  2. #2
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    Salut !
    Chez moi, sur une JXTable avec cellSelectionEnabled, je code un 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
    jXTable1.getColumnModel().getColumn(1).setCellRenderer(
                new DefaultTableCellRenderer() {
                    @Override
                    public Component getTableCellRendererComponent
                         (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                         super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);                            
                        if ((isSelected) && (row == table.getSelectedRow())) { 
                             if (value == null) {
                                 setValue("  /  /    ");
                             }   
                         }
                         return this;
                    }
                }
            );
    pour moi ça marche.
    Mais j'ai un problème avec mon JFormattedTextField qui est entouré d'une bordure... voir mon post précédent.

    Qu'en dis-tu ?

  3. #3
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Bonsoir Fraco,

    merci pour cette proposition mais cela ne colle pas.
    En effet, je n'ai pas de souci avec le renferer DefaultTableCellRenderer, mais avec le DefaultCellEditor.
    C'est lors de l'édition directe de la cellule, que Java inscrit le 1er caractère tapé, en 2ème position derrière un '0'. Je ne comprends pas ce comportement.

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    J'ai résolu le problème.

    Le problème se situe souvent au niveau du programmeur
    En fait je n'avais pas compris les mécanismes qui régissent une classe étendant DefaultCellEditor.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public Component getTableCellEditorComponent( JTable jTbl, Object oVal, boolean yaselection, int l, int c ) {
      JFormattedTextField fTxtField = (JFormattedTextField)super.getTableCellEditorComponent( jTbl, oVal, yaselection, l, c );
     
      if( oVal != null )
        fTxtField.setText( oVal.toString());
     
      return fTxtField;
    }
    Cette section du code est appelée une fois, lorsque l'utilisateur entre le 1er caractère dans la cellule. A ce moment, oVal, contient la valeur issue de getValueAt de la classe gérant les données de la table.
    Ensuite, les autres caractères saisis sont contrôlés selon le schéma du MaskFormatter, et cette section n'est plus sollicitée.

    J'ai donc adapté le code comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public Component getTableCellEditorComponent( JTable jTbl, Object oVal, boolean yaselection, int l, int c ) {
      JFormattedTextField fTxtField = (JFormattedTextField)super.getTableCellEditorComponent( jTbl, oVal, yaselection, l, c );
     
     
      if( oVal == null )
        fTxtField.setValue( null );
      else if( (long)oVal == 0 ) // Valeur rencontrée suite à l'initialisation des données
        fTxtField.setValue( null );
      else
        fTxtField.setValue( C_Projet.formatDate.format( oVal )); // Valeur formatée en "##/##/####"
     
      return fTxtField;
    }
    Ce post à titre indicatif pour celui ou celle qui sera confronté un jour à ce problème.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 23/07/2002, 15h33
  2. soustraire deux dates ?
    Par joejoe dans le forum SQL
    Réponses: 2
    Dernier message: 19/07/2002, 16h53
  3. Generation d'evenements a une date precise
    Par pascalzzz dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2002, 16h21
  4. Réponses: 3
    Dernier message: 06/05/2002, 19h24
  5. Réponses: 3
    Dernier message: 19/04/2002, 01h11

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