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 :

[JTable] Soucis de locales


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 4
    Par défaut [JTable] Soucis de locales
    Bonjour à tous,

    J'ai un petit souci avec les locales dans une JTable editable.

    Le contenu de la JTable est généré depuis une base de données MySQL, le séparateur de décimales est donc le point (.).

    Par défaut, si l'on édite une telle cellule et que l'on entre une virgule, il est impossible de valider et de sortir du champ.

    Après moultes essais et galères, je suis parvenu à "localiser" cette cellule en fr (donc en utilisant la virgule (,) pour séparateur de décimales). Cela fonctionne plutot bien, mais lorsque j'entre un point (.) et que je valide, non seulement l'entrée est acceptée, mais il me supprime purement et simplement les décimales (ex. 21.251 devient 21 !)

    Le code que j'ai utilisé est le suivant :
    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
     
        private class CurrencyCellEditor extends DefaultCellEditor {
    		private NumberFormat currencyFormat;
     
    		public CurrencyCellEditor(final JFormattedTextField tf, NumberFormat nf) {
    			super(tf);
    			currencyFormat = nf;
    			tf.setFocusLostBehavior(JFormattedTextField.COMMIT);
    			tf.setHorizontalAlignment(SwingConstants.TRAILING);
     
    			delegate = new EditorDelegate() {
     
    				public void setValue(Object param) {
    					BigDecimal _value = (BigDecimal) param;
    					if(_value!=null){
    						float _d = _value.floatValue();
    						String _format = currencyFormat.format(_d);
    						tf.setValue(_format);					
    					}
    				}
     
    				public Object getCellEditorValue() {
    					try {
    						String _field = tf.getText();
    						Number _number = currencyFormat.parse(_field);
    						double _parsed = _number.floatValue();
    						BigDecimal d = new BigDecimal(_parsed);
    						d = d.setScale(2, RoundingMode.HALF_EVEN);
    						System.out.println(d.scale());
    						return d;
    					} catch (ParseException e) {
    						return null;
    					}
    				}
     
    			};
    		}
    	}
    Je l'appelle avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    getColumnModel().getColumn(3).setCellEditor(new CurrencyCellEditor(
            		new JFormattedTextField(), NumberFormat.getInstance(Locale.FRENCH)));
    J'ai tenté de me baser sur la validité de mon JFormattedTextField en ajoutant la méthode ci dessous dans le EditorDelegate mais sans aucun succès...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	            public boolean stopCellEditing() {
    	            	if(!tf.isEditValid()){
    	                    Border Bordure=BorderFactory.createMatteBorder(1,1,1,1,Color.red);
    	            		tf.setBorder(Bordure);
    	            		return false;
    	            	}
    	                return super.stopCellEditing();   
    	            }
    Comment puis-je donc faire pour récupérer le comportement par défaut ?

    D'avance merci pour toute suggestion ou piste

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 77
    Par défaut
    Il peut s'agir d'un problème de type de données. Il faut d'abord vérifier que tu n'a pas déclaré de INT en mySQL sinon java le convertira par défaut en int, même chose pour les dates (TIMESTAMP) , les heures (TIME), etc... Après tu peux essayer de forcer le types des colonnes de ta table.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 4
    Par défaut
    Merci pour ta réponse Vrylx.

    Le champ MySql est en Decimal(5,2), et donc Java me renvoie un BigDecimal. Je pense que c'est une bonne idée de conserver le BigDecimal qui est (si je ne me trompe) l'équivalent Java du Decimal de MySQL...

    La première mouture de cette méthode (développée par un collègue) se basait sur des float, le comportement était semblable, sauf que lorsque l'on éditait la cellule, il affichait un point et non une virgule... En clair, avec la 1ere version, éditer la cellule contenant 21,345 et valider retournait 21.345 donc 21 :-/

    En résumé, que je travaille sur du float, du double ou du bigdecimal, le résultat est le même

    Je n'exclue pas le problème du type de données, mais je vais continuer à chercher du coté du formatter, je pense que c'est lui qui me renvoie nimporte quoi

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 4
    Par défaut
    Bon,

    après quelques recherches, il apparait qu'il faille utiliser un InputVerifier plutot qu'un JFormattedTextField pour empecher la sortie (et éventuellement afficher un message ou autre) en cas de saisie invalide.

    Néanmoins, avec ces 2 méthodes, dès que l'on entre un point en lieu et place du séparateur de décimales, les décimales sont ignorées...

    Cela devient vraiment gênant à l'utilisation car la pavé numérique renvoie un point et non une virgule... Existe-t-il un moyen de contrer ce problème ? Peut être en jonglant avec les locales ? Mais dans ce cas je crains que d'autres locales supportent assez mal la 'bidouille'

    Enfin bref, je reste à l'écoute de toute proposition ou solution à ce problème.

    Je n'ai - il est vrai - pas encore essayé de forcer le type de colonne de la table, mais ce sera fait sous peu...

    D'avance merci

Discussions similaires

  1. [phpMyAdmin] Soucis d'import de base sql local-> live
    Par Silv4 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 03/04/2012, 11h08
  2. [JTable][RowFilter] Souci de compréhension
    Par mavina dans le forum Composants
    Réponses: 1
    Dernier message: 11/09/2008, 10h33
  3. Réponses: 3
    Dernier message: 02/05/2007, 10h39
  4. Réponses: 13
    Dernier message: 19/04/2007, 15h18
  5. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51

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