|
La classe "Preferences" est une branche hiérarchie de la collection Preferences. Elle nous permet de sauvegarder et récupérer des données de configuration. Ces données sont stockées en permanant dans une mémoire auxiliaire d’exécution, nous nous somme pas top concerne pas la façon comment cette mémoire est gère mais il faudra savoir qu'il y a deux branches de préférence : de type système et de type utilisateur. La branche système est partagée par tous les utilisateurs d'un système. Tous changements faits au niveau de la branche sont immédiatement évidents à tous les utilisateurs du système. La branche d'utilisateur est une branche dont les valeurs sont accessibles seulement par l'utilisateur en utilisant l'application.
Pour mieux comprendre l'utilité, on va reprendre l’exemple de l’internationalisation Preference.java et le modifier en lui ajoutant un menu de langue pour que l’utilisateur sélectionne sa langue préfère.
Fichiers des langues: Preference_fr_FR.properties et Preference_en_US.properties.
Preference.java
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class Preference extends JFrame {
private JPanel contentPane;
private JLabel paysLabel = new JLabel();
private JLabel dateLabel = new JLabel();
private JLabel tempsLabel = new JLabel();
private JLabel montantLabel = new JLabel();
private JTextField paysText = new JTextField();
private JTextField dateText = new JTextField();
private JTextField tempsText = new JTextField();
private JTextField montantText = new JTextField();
private JMenuBar menuBar = new JMenuBar();
private JMenu menuLangue = new JMenu();
private JCheckBoxMenuItem menuFrancais = new JCheckBoxMenuItem();
private JCheckBoxMenuItem menuEnglais = new JCheckBoxMenuItem();
private ResourceBundle bundle;
public Preference(Locale locale) {
bundle = ResourceBundle.getBundle("Preference", locale);
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(4, 2));
menuLangue.add(menuEnglais);
menuLangue.add(menuFrancais);
menuBar.add(menuLangue);
setJMenuBar(menuBar);
contentPane.add(paysLabel, null);
contentPane.add(paysText, null);
contentPane.add(dateLabel, null);
contentPane.add(dateText, null);
contentPane.add(tempsLabel, null);
contentPane.add(tempsText, null);
contentPane.add(montantLabel, null);
contentPane.add(montantText, null);
menuFrancais.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Locale locale = new Locale("fr", "FR");
bundle = ResourceBundle.getBundle("Preference", locale);
InitText(locale);
menuEnglais.setSelected(false);
}
});
menuEnglais.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Locale locale = new Locale("en", "US");
bundle = ResourceBundle.getBundle("Preference", locale);
InitText(locale);
menuFrancais.setSelected(false);
}
});
InitText(locale);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setSize(293, 123);
setVisible(true);
}
private void InitText(Locale locale) {
setTitle(bundle.getString("PTitle"));
paysLabel.setText(bundle.getString("PPays"));
dateLabel.setText(bundle.getString("PDate"));
tempsLabel.setText(bundle.getString("PTemps"));
montantLabel.setText(bundle.getString("PMontant"));
menuLangue.setText(Messages.getString("PLangue"));
menuFrancais.setText(Messages.getString("PFrancais"));
menuEnglais.setText(Messages.getString("PAnglais"));
DateFormat uneDate = DateFormat
.getDateInstance(DateFormat.LONG, locale);
DateFormat unTime = DateFormat.getTimeInstance(DateFormat.MEDIUM,
locale);
Object[] numero = new Object[] { NumberFormat.getCurrencyInstance(
locale).format(1234.56) };
String montant = MessageFormat.format(bundle.getString("Addition"),
numero);
paysText.setText(locale.getISO3Country());
dateText.setText(uneDate.format(new Date()));
tempsText.setText(unTime.format(new Date()));
montantText.setText(montant);
}
public static void main(String args[]) {
new Preference(Locale.getDefault());
}
}
|
|
Vous remarquez qu'à chaque exécution l'utilisateur, qui préfère la langue de Shakespeare par exemple, doit choisir sa langue préféré. C'est une manœuvre simple s'il ne s'agit que d'un seul paramètre, imaginons une seconde une application qui a une grande fréquence d'utilisation et une bonne dizaine d'élément à modifier à chaque exécution. Dans ce cas il vivement conseille d'implémenter le mécanisme de préférence définit par les classes du package "java.util.prefs". La valeur d'une préférence est représenté par une pairs clé et valeur, la clé doit obligatoirement être une chaine de caractère (String) quanta la valeur elle est de type primitives.
Dans notre exemple nous pouvons se contenter d'ajouter une propriété de type "Preferences" au programme précédent.
Preferences Prefs = Preferences.userNodeForPackage(Preference.class);
Puis pour lire ou sauvegarder un paramètre, nous invoquant respectivement les méthodes.
Prefs.get("Langue","fr");
Prefs.put("Langue","en");
Mais nous allons le faire autrement pour pourvoir entre autre réutiliser les préférences dans différents autres programmes. Pour cela nous allons crée une interface MyPrefrences.java qui contiendras une propriété Préférence ainsi que des propriétés représentant les paramètres.
MyPrefrences.java
importjava.util.prefs.Preferences;
public interface MyPreferences {
public static final Preferences Prefs = Preferences
.userNodeForPackage(MyPreferences.class);
public static final String KEYLANGUE = "Langue";
public static final String VALLANGUE = "fr";
public static final String KEYCOUNTRY = "Pays";
public static final String VALCOUNTRY = "FR";
}
|
Puis nous modifierons notre le programme pour gérer les préférences de l'utilisateur (Preference2.java).
Preference2.java
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
public class Preference2 extends JFrame implements MyPreferences {
private JPanel contentPane;
private JLabel paysLabel = new JLabel();
private JLabel dateLabel = new JLabel();
private JLabel tempsLabel = new JLabel();
private JLabel montantLabel = new JLabel();
private JTextField paysText = new JTextField();
private JTextField dateText = new JTextField();
private JTextField tempsText = new JTextField();
private JTextField montantText = new JTextField();
private JMenuBar menuBar = new JMenuBar();
private JMenu menuLangue = new JMenu();
private JCheckBoxMenuItem menuFrancais = new JCheckBoxMenuItem();
private JCheckBoxMenuItem menuEnglais = new JCheckBoxMenuItem();
private ResourceBundle bundle;
public Preference2() {
Locale locale = new Locale(Prefs.get(KEYLANGUE, VALLANGUE),
Prefs.get(KEYCOUNTRY, VALCOUNTRY));
bundle = ResourceBundle.getBundle("Preference", locale);
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(new GridLayout(4, 2));
menuLangue.add(menuEnglais);
menuLangue.add(menuFrancais);
menuBar.add(menuLangue);
setJMenuBar(menuBar);
contentPane.add(paysLabel, null);
contentPane.add(paysText, null);
contentPane.add(dateLabel, null);
contentPane.add(dateText, null);
contentPane.add(tempsLabel, null);
contentPane.add(tempsText, null);
contentPane.add(montantLabel, null);
contentPane.add(montantText, null);
menuFrancais.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Locale locale = new Locale("fr", "FR");
bundle = ResourceBundle.getBundle("Preference", locale);
InitText(locale);
menuEnglais.setSelected(false);
menuFrancais.setSelected(true);
Prefs.put(KEYLANGUE, "fr");
Prefs.put(KEYCOUNTRY, "FR");
}
});
menuEnglais.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Locale locale = new Locale("en", "US");
bundle = ResourceBundle.getBundle("Preference", locale);
InitText(locale);
menuFrancais.setSelected(false);
menuEnglais.setSelected(true);
Prefs.put(KEYLANGUE, "en");
Prefs.put(KEYCOUNTRY, "US");
}
});
InitText(locale);
if (locale.getCountry().equals(VALCOUNTRY)) {
menuFrancais.setSelected(true);
menuEnglais.setSelected(false);
} else {
menuFrancais.setSelected(false);
menuEnglais.setSelected(true);
}
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setSize(293, 123);
setVisible(true);
}
private void InitText(Locale locale) {
setTitle(bundle.getString("PTitle"));
paysLabel.setText(bundle.getString("PPays"));
dateLabel.setText(bundle.getString("PDate"));
tempsLabel.setText(bundle.getString("PTemps"));
montantLabel.setText(bundle.getString("PMontant"));
menuLangue.setText(Messages.getString("PLangue"));
menuFrancais.setText(Messages.getString("PFrancais"));
menuEnglais.setText(Messages.getString("PAnglais"));
DateFormat uneDate = DateFormat.getDateInstance(DateFormat.LONG, locale);
DateFormat unTime = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
Object[] numero = new Object[] { NumberFormat.getCurrencyInstance(locale)
.format(1234.56) };
String montant = MessageFormat.format(bundle.getString("Addition"),numero);
paysText.setText(locale.getISO3Country());
dateText.setText(uneDate.format(new Date()));
tempsText.setText(unTime.format(new Date()));
montantText.setText(montant);
}
public static void main(String args[]) {
new Preference2();
}
}
|
Exectutez le programme puis sélection la langue anglaise, essayez à nouveau pour observer le choix retenu...
Télécharger l'archive complet de ce tutoriel (Preferences.zip)
|