|
Formater le contenu des champs texte est devenu plus facile avec le J2SE 1.4 grâce à l’introduction de la classe javax.swing.JFormattedTextField. Il est maintenant plus facile de créer un champ texte qui contient des choses comme un nombre décimal avec exactement trois chiffres après la virgule, ou une chaîne de caractères qui est entièrement en majuscule. Dans ces exemples, vous examinerez le contenu et le comportement d’un JFormattedTextField.
Vous pouvez formatter le contenu d’un JFormattedTextField de plusieurs manières. Vous pouvez utilisez une des sous-classes des classes abstraites java.text.format tel que NumberFormat, MessageFormat et DateFormat. NumberFormat est elle même une classe abstraite. Vous obtenez le formatteur que vous désirez en utilisant l’une des méthodes statiques. La méthode getInstance() retourne un format de nombre par défaut pour la locale par défaut. Si vous décidez d’utiliser un JFormattedTextField pour les pourcents, vous pouvez utiliser getPercentInstance(). De la même manière, vous pouvez spécifier des entiers avec getIntegerInstance() ou une devise avec getCurrencyInstance(). Dans chacun de ces cas, la locale par défaut est utilisée. S’il est nécessaire de spécifier la locale, passer un objet de type Locale comme paramètre d’une des méthodes précédantes.
Dans l’exepmle qui suit, vous obtenez une instance de type NumberFormat. Vous pouvez ensuite adapter l’instance en spécifiant le nombre minimum ou maximum de chiffres qui apparait après la virgule.
NumberFormat format2 = NumberFormat.getInstance();
format2.setMinimumFractionDigits(1);
format2.setMaximumFractionDigits(4);
Voici une simple application Swing qui contient deux JFormattedTextField qui diffèrent légèrement dans leurs règles de formatage.
import java.awt.GridLayout;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class FormatEx1 extends JPanel {
private JFormattedTextField field1;
private JFormattedTextField field2;
public FormatEx1() {
super(new GridLayout(2, 2));
setUpField1();
setUpField2();
displayFields();
}
private void displayFields() {
add(new JLabel("field 1:"));
add(field1);
add(new JLabel("field 2:"));
add(field2);
}
private void setUpField1() {
NumberFormat format1;
format1 = NumberFormat.getInstance();
format1.setMaximumFractionDigits(2);
field1 = new JFormattedTextField(format1);
}
private void setUpField2() {
NumberFormat format2;
format2 = NumberFormat.getInstance();
format2.setMinimumFractionDigits(1);
format2.setMaximumFractionDigits(4);
field2 = new JFormattedTextField(format2);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Number Format Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.getContentPane().add(new FormatEx1());
frame.setVisible(true);
}
}
Compilez et exécutez l’application FormatEx1. Ensuite, entrez 123 dans le champ du haut (field 1). Il y a deux propriétés différentes pour tous JFormattedTextField : le texte et la valeur. Quand vous tapez 123, vous changez la valuer de la propriété texte. Dans cet exemple, la proriété valeur est placée quand le champ texte perd le focus. C’est la valeur qui sera formatée et modifiée pour être affichée proprement.
L’essentiel est que vous devriez seulement vous occuper de la propriété valeur et ignorer la propriété texte. Comme vous le verez dans le prochain exemple, vous vous pouvez spécifier quand la valeur du texte devrait être convertie en propriété valeur via la méthode setFocusLostBehavior() et la méthode setCommitsOnValidEdit() de l’objet DefaultFormatter. La propriété valeur pointe vers une instance d’Object. Dans ce cas, vous travaillez avec un Double qui peut être placé directement de la manière suivante:
setValue(new Double( someDouble));
Retournons à l’exeple... vous avez entrez 123 dans le champ du haut. Appuyez sur Tabulation pour allez sur le champ suivant (field 2). Rien ne devrait changer dans le nombre entré. Maintenant tapez 456 dans le champ 2, et retournez sur le champ 1. Le 456 devrait maintenant être affiché en 456.0 parce que vous avez spécifié qu’il doit y avoir au moins un chiffre après la virgule.

Changez le nombre dans le champ 1 en 0,123 et positionnez-vous sur le champ du bas. Le nombre affiché est modifié en 0,12 parce que dans l’application vaous avez spécifier que le nombre maximum de chiffres qui apparaissent après la virgule est 2. Maintenant entrez 0,45003 dans le champ 2 et appuyez sur tabulation. La valeur affiché dans le champ 2 est maintenant 0,45. La règle que vous mise en place dans l’application est que seulement quatre chiffres après la virgule peuvent être affiché.
Que se passe t-il si vous tapez une valeur absurde dans l’un des champs? Essaie d’entrez la chaîne abcd dans le champ 1. Dès que le champ perd le focus (tabulation ou autre), la valeur affichée dans le champ 1 redevient la valeur précédante de 0,12. Vous pouvez modifier ce comportement avec la méthode setFocusLostBehavior() de la classe JFormattedTextField. Vous pouvez aussi initialiser les champs avec une valeur spécifiée.
Dans l’exemple qui suit, vous placez 12,34 dans le champ 1 et 56,78 dans le champ 2. Egalement, vous spécifiez au champ 1 de retourner à sa valeur précédante, même si la nouvelle valeur est valide.
import java.awt.GridLayout;
import java.text.NumberFormat;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class FormatEx2 extends JPanel {
private JFormattedTextField field1;
private JFormattedTextField field2;
public FormatEx2() {
super(new GridLayout(2, 2));
setUpField1();
setUpField2();
displayFields();
}
private void displayFields() {
add(new JLabel("field 1:"));
add(field1);
add(new JLabel("field 2:"));
add(field2);
}
private void setUpField1() {
NumberFormat format1 = NumberFormat.getInstance();
field1 = new JFormattedTextField(format1);
field1.setValue(new Double(12.34));
field1.setFocusLostBehavior(JFormattedTextField.REVERT);
}
private void setUpField2() {
NumberFormat format2 = NumberFormat.getInstance();
field2 = new JFormattedTextField(format2);
field2.setValue(new Double(56.78));
field2.setFocusLostBehavior(JFormattedTextField.COMMIT);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Number Format Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.getContentPane().add(new FormatEx2());
frame.setVisible(true);
}
}
Compilez et exécutez l’application FormatEx2. Entrez 98,76 dans le champ 1 et pressez la touche tabulation. Le champ redevient 12,34. Le deuxième champ est spécifié pour faire un COMMIT, ainsi la méthode commitEdit() est appelée. Dans ce cas, même si vous entrez la chaîne abcd dans le champ 2 et appuyez sur tabulation, la chaîne est affiché comme nouvelle valeur du champ 2. Le comportement par défaut utilisé dans l’exemple précédant est COMMIT_OR_REVERT. Cela envoit la valeur formatté seulement si le texte entré est valide.

Il peut y avoir des fois où vous voulez restreindre l’entrée d’une manière particulière. Peut-être vous voulez que l’utilisateur écrive seulement des chiffres ou des lettres de l’alphabet. La classe MaskFormatter vous permet de spécifier le format de la chaîne entrée. Vous pouvez configurez un nouveau MaskFormatter quand vous l’instanciez de la manière suivante:
MaskFormatter formatter1 = new MaskFormatter("##.#%");
L’argument du constructeur est le masque. Voici les caractères que vous pouvez spécifier dans le masque, et leur signification:
# n’importe quel nombre valide
’ le caractère échape
? n’importe quel caractère
A n’importe quel caractère ou nombre
* tout
U n’importe quel caractère, mais toute lettre en minuscule sera en majuscule
L les lettes en majuscules seront en minuscules.
H spécifie un caractère hexa.
Si vous voulez limiter l’entrée dans une catégorie, utilisez les méthodes setValidCharacters() ou setInvalidCharacters(). Dans l’exemple de MaskFormatter ci-dessus, quand l’utilisateur écrit des nombres, les deux premiers chiffres apparaîtront à la gauche de la virgule décimale, et le troisième apparaîtra à droite. Les chiffres suivants ne seront pas visibles. Ainsi, si vous écrivez 1234, vous verrez 12,3%.
Voici un exemple qui utilise un champ avec "##.#%" comme masque de saisie, et un autre champ dans lequel une chaîne de six caractères est convertie de sorte que les caractères successifs aillent de majuscule à minuscule et de nouveau à majuscule.
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.text.MaskFormatter;
public class FormatEx3 extends JPanel {
private JFormattedTextField field1;
private JFormattedTextField field2;
public FormatEx3() {
super(new GridLayout(2, 2));
setUpField1();
setUpField2();
displayFields();
}
private void displayFields() {
add(new JLabel("field 1 (00.0 - 99.9%:"));
add(field1);
add(new JLabel("field 2: (6-alphas)"));
add(field2);
}
private void setUpField1() {
MaskFormatter formatter1 = null;
try {
formatter1 = new MaskFormatter("##.#%");
} catch (java.text.ParseException exc) {
exc.printStackTrace();
}
field1 = new JFormattedTextField(formatter1);
}
private void setUpField2() {
MaskFormatter formatter2 = null;
try {
formatter2 = new MaskFormatter("ULULUL");
} catch (java.text.ParseException exc) {
exc.printStackTrace();
}
field2 = new JFormattedTextField(formatter2);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Number Format Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 200);
frame.getContentPane().add(new FormatEx3());
frame.setVisible(true);
}
class FormatListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Hi");
}
}
}

Traduction de Core Java Technologies Tech Tips de java.sun.com
|