Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    mars 2006
    Messages
    1 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : mars 2006
    Messages : 1 235
    Points : 1 412
    Points
    1 412

    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 :
    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 ?
    @ bientôt...

    Salut & @+ sur 3W!

  2. #2
    Membre chevronné Avatar de fraco
    Inscrit en
    juin 2006
    Messages
    749
    Détails du profil
    Informations forums :
    Inscription : juin 2006
    Messages : 749
    Points : 770
    Points
    770

    Par défaut

    Salut !
    Chez moi, sur une JXTable avec cellSelectionEnabled, je code un renderer :

    Code :
    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 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : mars 2006
    Messages : 1 235
    Points : 1 412
    Points
    1 412

    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.
    @ bientôt...

    Salut & @+ sur 3W!

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    mars 2006
    Messages
    1 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : mars 2006
    Messages : 1 235
    Points : 1 412
    Points
    1 412

    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 :
    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 :
    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.
    @ bientôt...

    Salut & @+ sur 3W!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •