Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > AWT/SWING > Composants > Tables
Tables JTable, JXTable, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 13h34   #1
rtg57
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 191
Points : 1 517
Points : 1 517
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!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 20h22   #2
fraco
Membre chevronné
 
Avatar de fraco
 
Inscription : juin 2006
Messages : 739
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 739
Points : 761
Points : 761
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 ?
fraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 19h48   #3
rtg57
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 191
Points : 1 517
Points : 1 517
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!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 12h57   #4
rtg57
Membre Expert
 
Avatar de rtg57
 
Homme
Autodidacte
Inscription : mars 2006
Messages : 1 191
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Autodidacte
Secteur : Service public

Informations forums :
Inscription : mars 2006
Messages : 1 191
Points : 1 517
Points : 1 517
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!
rtg57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h33.


 
 
 
 
Partenaires

Hébergement Web