Ce forum est maintenant fermé, seule cette archive statique reste consultable.
  FORUM Rue-Montgallet.com
  Programmation
  Java

  Java - Interface graphique et internationalisation

Bas de page
Auteur Sujet :

Java - Interface graphique et internationalisation

n°17932
Corey8
Profil : Jeune recrue
Posté le 28-11-2006 à 15:29:28  
 

Bonjour à tous,
 
Je suis en train (plutôt je commence) de développer une application en interface graphique (Java - Swing). Je rencontre tout d'abord quelques difficultés à bien construire mon code. Voilà un exemple de ce que j'ai fait :

Code :
  1. import javax.swing.JFrame;
  2. public class FenetrePrincipal{
  3. public static void main(String args[]){
  4.  JFrame frame = new JFrame("Fenêtre principal" );
  5.  new BarreMenu(frame);
  6.  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  7.  frame.setSize(800, 600);
  8.  frame.setVisible(true);
  9. }
  10. }
  11. import javax.swing.JFrame;
  12. import javax.swing.JMenu;
  13. import javax.swing.JMenuBar;
  14. import javax.swing.JMenuItem;
  15. import javax.swing.JSeparator;
  16. import javax.swing.KeyStroke;
  17. public class BarreMenu {
  18. final JFrame frame;
  19. public BarreMenu(JFrame frame){
  20.  this.frame = frame;
  21.  JMenuBar menuBar = new JMenuBar();
  22.  ajouterMenuFichier(menuBar);
  23.  frame.setJMenuBar(menuBar);
  24. }
  25. private void ajouterMenuFichier(JMenuBar menuBar){
  26.  JMenu menuFichier = new JMenu("Fichier" );
  27.  JMenuItem menuItemDeconnexion = new JMenuItem("Changer d'utilisateur..." );
  28.  JMenuItem menuItemQuitter = new JMenuItem("Quitter" );
  29.  menuItemQuitter.addActionListener(new ActionListener(){
  30.   public void actionPerformed(ActionEvent event){
  31.    frame.dispose();
  32.   }
  33.  });
  34.  menuItemDeconnexion.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.CTRL_MASK));
  35.  menuItemQuitter.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.CTRL_MASK));
  36.  menuFichier.add(menuItemDeconnexion);
  37.  menuFichier.add(menuItemQuitter);
  38.  menuBar.add(menuFichier);
  39. }
  40. }


 
Donc en fait comme c'est une "belle" (assez grosse) interface je vais découper la frame principale en sous-classes afin que ce soit plus "propre". Comme dans mon exemple ci-dessus une classe pour le menu.  
J'ai un peu de mal à bien structurer mon code parce que voilà ce que le prof (oui c'est un projet d'études) ne veut pas que l'on fasse dans notre code :
 
Java est un langage Objet, il est donc possible d'utiliser l'héritage.
 
Doit-on hériter par exemple de la classe JFrame ? NON !
 
ex à pas faire :  

Code :
  1. import javax.swing.*;
  2. public class MorphSwing2 extends JFrame {
  3. public MorphSwing2() {
  4.  super("MorphSwing2" );
  5.  JButton button=new JButton("Ok" );
  6.  setContentPane(button);
  7.  setSize(400,300);
  8.  setVisible(true);
  9. }
  10. public static void main(String[] args) {
  11.  new MorphSwing2();
  12. }
  13. }


 
mais

Code :
  1. import javax.swing.*;
  2. public class MorphSwing1 {
  3. public static void main(String[] args) {
  4.  JButton button=new JButton("Ok" );
  5.  JFrame frame=new JFrame("MorphSwing1" );
  6.  frame.setContentPane(button);
  7.  frame.setSize(400,300);
  8.  frame.setVisible(true);
  9. }
  10. }


 
On hérite d'une classe si on veut en changer les fonctionnalités (i.e. redéfinir une méthode)
 
Il est possible de faire des fonctions pour rendre le code plus clair
 
Et enfin,  
Doit-on stocker les composants en tant qu'attributs de la classe ?
NON! Les composants sont déjà stockés dans leurs parents.
 
ex :

Code :
  1. import javax.swing.*;
  2. public class MorphSwing4 extends JFrame {
  3. private final JButton button; // idiot
  4. public MorphSwing4() {
  5.  super("MorphSwing2" );
  6.  button=new JButton("Ok" );
  7.  setContentPane(button);
  8. }
  9. public static void main(String[] args) {
  10.  JFrame frame=new MorphSwing4();
  11.  frame.setSize(400,300);
  12.  frame.setVisible(true);
  13. }
  14. }


 
Si des personnes pouvait me dire ce qu'il ne va pas dans mon code ou ce qu'il faudrait que j'améliore se serai vraiment sympa.
 
Sinon, je voudrais aussi intégrer la possibilité d'internationaliser mon appli donc j'ai trouvé ce code qu'il a l'aire pas mal :  

Code :
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import java.util.Locale;
  4. import java.util.ResourceBundle;
  5. public class LanguageChooser implements ActionListener {
  6. // Nom du fichier properties (sans les codes ISO)
  7. private static final String LANGUAGE_FILE = "language";
  8. private static ResourceBundle resourceBundle;
  9. // La fenetre
  10. private MyFrame frame;
  11. public LanguageChooser(MyFrame aFrame) {
  12.  frame = aFrame;
  13.  resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale.getDefault());
  14. }
  15. // Methode appelee lorsqu’on selectionne un menu
  16. public void actionPerformed(ActionEvent arg0) {
  17.  // On a selectionne le menu anglais
  18.  if (arg0.getActionCommand().equals("menuEn" )) {
  19.  // On choisi le fichier anglais
  20.  resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale.US);
  21.  }
  22.  // Sinon on choisi le francais
  23.  else if (arg0.getActionCommand().equals("menuFr" )) {
  24.  // On choisi le francais
  25.  resourceBundle = ResourceBundle.getBundle(LANGUAGE_FILE, Locale.FRANCE);
  26.  }
  27.  //On modifie les labels avec la nouvelle langue
  28.  frame.paintLabelWithLanguage();
  29. }
  30. /*
  31. * Methode statique qui permet de recuperer un String du fichier de langue
  32. * en fonction de la cle passee en parametre
  33. */
  34. public static String getAnInternationalizeString(String key) {
  35.  // On retourne la valeur associee a la cle
  36.  return resourceBundle.getString(key);
  37. }
  38. }
  39. import javax.swing.*;
  40. public class MyFrame extends JFrame {
  41. // Déclaration des différents composants
  42. private JLabel labelHello;
  43. private JMenuBar menuBar;
  44. private JMenu menuLanguage;
  45. private JMenuItem menuFr;
  46. private JMenuItem menuEn;
  47. private LanguageChooser languageChooser;
  48. // Point d’entrée de l’application
  49. public static void main(String[] args) {
  50.  MyFrame fenetre = new MyFrame();
  51. }
  52. public MyFrame() {
  53.  // Initialisation standard
  54.  super("Application Internationale" );
  55.  setSize(300, 300);
  56.  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  57.  // Création du LanguageChooser
  58.  languageChooser = new LanguageChooser(this);
  59.  // Création du label
  60.  labelHello = new JLabel();
  61.  getContentPane().add(labelHello);
  62.  // Création de la barre de menu
  63.  menuBar = new JMenuBar();
  64.  menuLanguage = new JMenu();
  65.  menuFr = new JMenuItem("Francais" );
  66.  menuFr.setActionCommand("menuFr" );
  67.  menuFr.addActionListener(languageChooser);
  68.  menuLanguage.add(menuFr);
  69.  menuEn = new JMenuItem("English" );
  70.  menuEn.setActionCommand("menuEn" );
  71.  menuEn.addActionListener(languageChooser);
  72.  menuLanguage.add(menuEn);
  73.  menuBar.add(menuLanguage);
  74.  setJMenuBar(menuBar);
  75.  // On initailise les valeurs des labels, menus
  76.  paintLabelWithLanguage();
  77.  // On affiche la fenêtre
  78.  setVisible(true);
  79. }
  80. /*
  81. * Méthode qui initialise le texte des différents labels et menus en
  82. * fonction de la langue
  83. */
  84. protected void paintLabelWithLanguage() {
  85.  menuLanguage.setText(LanguageChooser.getAnInternationalizeString("menuLanguage" ));
  86.  labelHello.setText(LanguageChooser.getAnInternationalizeString("labelHello" ));
  87. }
  88. }


Mais voilà j'ai du mal à l'intégrer dans mon code afin que les conditions du prof soient respectées et que je puisse l'utiliser sur différent de la fenêtre (menu, calendrier, panel central, pop-up, ...). Si vous avez des aidés elles sont les bienvenues.
 
Merci d'avance à tous


Message édité par Corey8 le 28-11-2006 à 16:11:19
mood
Pub
Posté le 28-11-2006 à 15:29:28  
 

  FORUM Rue-Montgallet.com
  Programmation
  Java

  Java - Interface graphique et internationalisation

© 2000-2024 Forum.rue-montgallet.com - Tous droits réservés