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