Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3569 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Bien développer sa GUI

n°1095157
Cherrytree
cn=?
Posté le 24-05-2005 à 15:53:38  profilanswer
 

Reprise du message précédent :
Tiens, un exemple :
 

Code :
  1. package swingdemo;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.ActionEvent;
  6. public class ComboBoxDemo extends JFrame implements ActionListener {
  7.     private DefaultComboBoxModel comboBoxModel;
  8.     private JButton button;
  9.     private JComboBox comboBox;
  10.     public ComboBoxDemo() {
  11.         Container contentPane = getContentPane();
  12.         contentPane.setLayout(new FlowLayout());
  13.         comboBoxModel = new DefaultComboBoxModel(new String[] {"Element #0"});
  14.         comboBox = new JComboBox(comboBoxModel);
  15.         contentPane.add(comboBox);
  16.         button = new JButton("Button" );
  17.         button.addActionListener(this);
  18.         contentPane.add(button);
  19.     }
  20.     public void actionPerformed(ActionEvent e) {
  21.         Object source = e.getSource();
  22.         if (source == button) {
  23.             comboBoxModel.addElement("Element #" + comboBoxModel.getSize());
  24.             comboBox.setSelectedIndex(comboBox.getItemCount() - 1);
  25.         }
  26.     }
  27.     public static void main(String[] args) {
  28.         JFrame frame = new ComboBoxDemo();
  29.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30.         frame.pack();
  31.         frame.setVisible(true);
  32.     }
  33. }


---------------
Le site de ma maman
mood
Publicité
Posté le 24-05-2005 à 15:53:38  profilanswer
 

n°1095170
c0wb0y
:d
Posté le 24-05-2005 à 16:00:32  profilanswer
 

Ha ouais, c'est plus complexe que je croyais :]
 
J'vais essayer avec ça, merci :)

n°1096370
c0wb0y
:d
Posté le 25-05-2005 à 11:59:29  profilanswer
 

merci Cherytree :)
 
Grâce a ton exemple, j'ai reussi a trouver dans netbeans comment utiliser un model dans le jComboBox, ca marche now :)

n°1096979
Cherrytree
cn=?
Posté le 25-05-2005 à 17:08:52  profilanswer
 

J'en suis heureux.


---------------
Le site de ma maman
n°1096990
nraynaud
lol
Posté le 25-05-2005 à 17:11:47  profilanswer
 

il faudrait que je fasse le tuto quand même :/


---------------
trainoo.com, c'est fini
n°1097011
Jubijub
Parce que je le VD bien
Posté le 25-05-2005 à 17:20:58  profilanswer
 

oui c clair...introduis nous.........à swing


---------------
Jubi Photos : Flickr - 500px
n°1097012
nraynaud
lol
Posté le 25-05-2005 à 17:21:41  profilanswer
 

oué parce que le code en début de page :/


---------------
trainoo.com, c'est fini
n°1097013
Jubijub
Parce que je le VD bien
Posté le 25-05-2005 à 17:22:38  profilanswer
 

ben on attends tous...ca m'intéresserait, je v avoir besoin de refaire du swing dans pas longtemps...
 
et c vrai que le bordel du paint, la surcharge de composants et tout ca, c pas super limpide dans swing...


---------------
Jubi Photos : Flickr - 500px
n°1097035
Cherrytree
cn=?
Posté le 25-05-2005 à 17:34:32  profilanswer
 

nraynaud a écrit :

oué parce que le code en début de page :/


Quoi qu'est-ce qu'il a ce code ? Il démontre la fonctionnalité. C'est tout.


---------------
Le site de ma maman
n°1097040
nraynaud
lol
Posté le 25-05-2005 à 17:38:13  profilanswer
 


en montrant à côté les 15 trucs qu'il ne faut pas faire dans la vraie vie.
 
A la fin, on se retrouve avec que des exemples qui n'ont qu'un seul point issu de la vraie vie (et tout le reste douteux), au lieu de baigner en permanence dans les bonnes pratiques.
 
Imagine l'influence sur les stagiaires.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 25-05-2005 à 17:38:13  profilanswer
 

n°1097049
Cherrytree
cn=?
Posté le 25-05-2005 à 17:45:06  profilanswer
 

En même temps, je vais pas me frapper un fichier de classe pour mettre la méthode main, un fichier de classe pour mettre le listener, et esquiver le "extends JFrame", chose pour laquelle je ne comprends toujours pas comment on peut faire différemment.
 
Avec ça, j'en suis à trois. Alors mettons, je suis le bon gars, j'externalise mon modèle dans une classe à lui, et encore je suis pas sûr du gain. ça fait quatre, ils sont où les 11 autres ? (je trouve que tu exagères)


Message édité par Cherrytree le 25-05-2005 à 17:47:01

---------------
Le site de ma maman
n°1097056
nraynaud
lol
Posté le 25-05-2005 à 17:49:51  profilanswer
 

éviter de binder le panel à la frame pour pourvoir éventuellement utiliser des internalframe, les imports, le nom du package, le setVisible() pas isolé, le bouton sans Action ...
 
j'avais justement commencé à le réécrire en début d'aprèm, mais je me suis dit qu'au boulot c'était limite donc j'ai arrêté.


---------------
trainoo.com, c'est fini
n°1097062
nraynaud
lol
Posté le 25-05-2005 à 17:55:09  profilanswer
 

maintenant, il est clair que c'est aussi ma responsabilité de recracher tout ce que je sais pour contribuer à l'ambiance d'apprentissage positif.


---------------
trainoo.com, c'est fini
n°1097073
Cherrytree
cn=?
Posté le 25-05-2005 à 18:02:57  profilanswer
 

nraynaud a écrit :

maintenant, il est clair que c'est aussi ma responsabilité de recracher tout ce que je sais pour contribuer à l'ambiance d'apprentissage positif.


[:plusun]
Maintenant prends mon point de vue, je veux démontrer un fonctionnement ponctuel. C'est déjà très lourd de faire un setup compact d'un application Swing. Si je me farcis les n bonnes pratiques que-tout-développeur-Swing-doit-connaître... au final qu'est ce que ça va donner.

  • Je vais passer deux fois plus de temps à fabriquer mon exemple.
  • Je vais probablement noyer le poisson.


Pour le package, j'aurais dû mettre com.nraynaud.swingdemo, mais j'ai eu peur d'indisposer le propriétaire.


---------------
Le site de ma maman
n°1097132
c0wb0y
:d
Posté le 25-05-2005 à 19:07:26  profilanswer
 

Accésoirement j'aurais surement rien compris  :D  
 
La globalité de mon code n'est clairement pas orienté belle méthode et bon design pattern, mais bon, je connais pas, pas le temps d'apprendre, alors j'ai fait un truc fonctionnel et bien découpé. ^^
 
Pourquoi il ne faut pas faire :  
"éviter de binder le panel à la frame pour pourvoir éventuellement utiliser des internalframe, les imports, le nom du package, le setVisible() pas isolé, le bouton sans Action ..."
 
J'en sais rien :x Mais j'aimerai apprendre également, le tuto sera le bienvenue ;)

n°1097137
Jubijub
Parce que je le VD bien
Posté le 25-05-2005 à 19:14:41  profilanswer
 

pour les actions je peux répondre : souvent, si t'a besoin d'un bouton, c'est pour qu'il serve de déclencheur. Bien souvent aussi, tu peux voiloir déclencher ta "fonction" depuis divers endroits (barre d'icone, bouton sur place, menu contextuel, menu de l'application)
Là encore, tu va avoir : une icone semblable, un tooltip identique, un label commun, et un appel d'action identique.
 
Ohhh magie, l'action swing est ce qu'il te fait : ca te fait un wrapper du tout, plus la gestion d'events...et c'est intégré dans swing, de sorte qu'un JButton a un constructeur qui prend une action en paramètre...les menuitems aussi


---------------
Jubi Photos : Flickr - 500px
n°1097281
nraynaud
lol
Posté le 25-05-2005 à 21:16:38  profilanswer
 

c0wb0y a écrit :

Accésoirement j'aurais surement rien compris  :D  


meu non.
 
Il faut bien voir que pour faire de la merde, personne n'a besoin d'aide, donc on peut te montrer du beau code, pas de risque qu'il se retrouve dans ton code à toi. D'autre part, il faut déjà avoir une explication et de la bouteille pour comprendre en quoi il est beau ou pas et ce qu'il a de beau ou de commun.
 
Enfin, c'est pas forcément du "beau" qu'on cherche, mais de l'efficace. Actuellement, je déplombe mon application perso, et je constate que les bugs ne touchent que très rarement plus d'un fichier : j'ai plutôt merdé sur des détails que sur l'essentiel (la collaboration des objets).


---------------
trainoo.com, c'est fini
n°1097496
nraynaud
lol
Posté le 26-05-2005 à 01:16:31  profilanswer
 

Code :
  1. package com.nraynaud.swingtuto;
  2. import java.awt.Container;
  3. import java.awt.FlowLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import javax.swing.AbstractAction;
  7. import javax.swing.Action;
  8. import javax.swing.DefaultComboBoxModel;
  9. import javax.swing.JButton;
  10. import javax.swing.JComboBox;
  11. import javax.swing.JFrame;
  12. import javax.swing.JPanel;
  13. import javax.swing.ListSelectionModel;
  14. import javax.swing.SwingUtilities;
  15. import javax.swing.Timer;
  16. /**
  17. * @author nraynaud
  18. *  
  19. * Une petite classe de démonstration de swing, elle ne fait que wrapper un
  20. * ComboBoxModel.
  21. */
  22. public class SimpleUI {
  23.     private DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(
  24.             new String[] { "Element #0"});
  25.     private Action addElementAction = new AbstractAction("Add Element" ) {
  26.         public void actionPerformed(ActionEvent e) {
  27.             String element = "Element #" + comboBoxModel.getSize();
  28.             comboBoxModel.addElement(element);
  29.             comboBoxModel.setSelectedItem(element);
  30.         }
  31.        
  32.     };
  33.     public void populatePanel(JPanel panel) {
  34.         panel.setLayout(new FlowLayout());
  35.         panel.add(new JComboBox(comboBoxModel));
  36.         panel.add(new JButton(addElementAction));
  37.     }
  38.     //pour jouer avec l'Action
  39.     public void disableAddElementActionForFourSeconds() {
  40.         addElementAction.setEnabled(false);
  41.         new Timer(4000, new ActionListener() {
  42.             public void actionPerformed(ActionEvent e) {
  43.                 addElementAction.setEnabled(true);
  44.             }
  45.         }).start();
  46.     }
  47.     public static void main(String[] args) {
  48.         // faire du swing, c'est assembler des composants et adapter des
  49.         // évènements :
  50.         final JFrame frame = new JFrame("fenêtre principale" );
  51.         final SimpleUI ui = new SimpleUI();
  52.         ui.populatePanel((JPanel) frame.getContentPane());
  53.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  54.         SwingUtilities.invokeLater(new Runnable() {
  55.             public void run() {
  56.                 frame.pack();
  57.                 frame.setVisible(true);
  58.             }
  59.         });
  60.         //jouons un peu :
  61.         final JFrame frame2 = new JFrame("secondaire" );
  62.         ui.populatePanel((JPanel) frame2.getContentPane());
  63.         frame2.getContentPane().add(
  64.                 new JButton(new AbstractAction("Desactiver 4s" ) {
  65.                     public void actionPerformed(ActionEvent e) {
  66.                         ui.disableAddElementActionForFourSeconds();
  67.                     }
  68.                 }));
  69.         SwingUtilities.invokeLater(new Runnable() {
  70.             public void run() {
  71.                 frame2.pack();
  72.                 frame2.setVisible(true);
  73.             }
  74.         });
  75.     }
  76. }


 
(ça ouvre 2 frames, elle peuvent être empilées à l'ouverture)
 
on voit ici bien le MVC, toute modification sur le modele modifie toutes les vues.
 
J'ai aussi illustré un des intérêts des Actions : on peut les désactiver et ça désactive tous leurs actionneurs (y compris si elle était passée en menu ou en icone dans une barre d'outil).
 
Dans la vraie vraie vie, le main ne serait pas là. Mais on constate que le composant est conçu de telle manière qu'il peut être emboîté dans une IHM plus grande, mis dans une frame, une internal frame ou autre chose.
 
les pack() et setVisible() de la frame doivent toujours être appellés comme ça, c'est expliqué ici : http://java.sun.com/docs/books/tut [...] reads.html
mais c'est pas encore le moment d'en parler pour les débutants.
 
tout le code en dessous de "jouons un peu" n'est bien entendu jamais à copier, c'est de la bidouille pour illustrer la désactivation de l'action.


---------------
trainoo.com, c'est fini
n°1097993
Bandenabos
§;o)
Posté le 26-05-2005 à 14:09:23  profilanswer
 

Salut,
 
j'avoue que je n'ai pas lu ton topic entièrement, par contre je ne vois nulle part une référence au design pattern MVC. Celui-ci te permet d'avoir un réel découplage entre donnée et vue en insérant un controleur dans lequel tu poseras ton code orienté applicatif. Fais des recherches tu trouveras plein d'article en parlant certainement mieux que moi.
Attention toutefois de ne pas confondre avec le MVC2 qui est une version pour le J2EE pas adapté au client lourd SWING.
 
En gros ta vue ne contient que les composants, ton modèle que les données et c'est le controleur qui exécute du code en fonction des actions provenant de la vue (ton controleur est abonné à tous les événements des composants de la vue nécessaires).
 
Concerant le design pure des écrans l'utilisation de GridBagLayout est fortement recommandé.
 
@+

n°1098019
Cherrytree
cn=?
Posté le 26-05-2005 à 14:18:41  profilanswer
 

Bandenabos a écrit :


Concerant le design pure des écrans l'utilisation de GridBagLayout est fortement recommandé.
@+


Pas par moi en tous cas.


---------------
Le site de ma maman
n°1098299
Jubijub
Parce que je le VD bien
Posté le 26-05-2005 à 16:12:20  profilanswer
 

ben c le plus riche...mais c pas toujours le plus adapté, ca dépend de la GUI à faire...


---------------
Jubi Photos : Flickr - 500px
n°1098305
c0wb0y
:d
Posté le 26-05-2005 à 16:19:55  profilanswer
 

J'ai compris le principe pour wrapper des actions (:
 
C'est vrai que c'est pratique, avec ça, faire des racourcis pour les actions devient un jeu d'enfant :)
Il me reste pas assez de temps pour reprendre mon code de cette manière, mais dorénavent j'essayerai d'utiliser ce principe :)
 
Par contre, le invokeLater() ca sert à quoi  concrètement? :x (j'ai déjà le la doc mais ca m'a pas très bien eclaircit)

n°1098309
beemer
Posté le 26-05-2005 à 16:23:04  profilanswer
 

Bandenabos a écrit :


Concerant le design pure des écrans l'utilisation de GridBagLayout est fortement recommandé.


pas vraiment, non...
 
nraynaud :
d'apres le tuto de java on est suppose creer les compo dans le bon thread pas uniquement l'affichage, non?


Message édité par beemer le 26-05-2005 à 16:31:33
n°1098318
nraynaud
lol
Posté le 26-05-2005 à 16:25:59  profilanswer
 

c0wb0y a écrit :

J'ai compris le principe pour wrapper des actions (:
 
C'est vrai que c'est pratique, avec ça, faire des racourcis pour les actions devient un jeu d'enfant :)
Il me reste pas assez de temps pour reprendre mon code de cette manière, mais dorénavent j'essayerai d'utiliser ce principe :)
 
Par contre, le invokeLater() ca sert à quoi  concrètement? :x (j'ai déjà le la doc mais ca m'a pas très bien eclaircit)


en fait, il existe un thread spécial pour swing, et on doit y faire toutes les actions impactant l'aspect visuel des composants. Tous les handlers d'évènements y sont exécutés, donc pas de problème de ce côté.
 
par contre, le main() est exécuté dans un autre thread.
 
invokeLater() exécute le bout de code dans le thread de swing.


---------------
trainoo.com, c'est fini
n°1098320
Jubijub
Parce que je le VD bien
Posté le 26-05-2005 à 16:27:37  profilanswer
 

c0wb0y a écrit :

J'ai compris le principe pour wrapper des actions (:
 
C'est vrai que c'est pratique, avec ça, faire des racourcis pour les actions devient un jeu d'enfant :)
Il me reste pas assez de temps pour reprendre mon code de cette manière, mais dorénavent j'essayerai d'utiliser ce principe :)
 
Par contre, le invokeLater() ca sert à quoi  concrètement? :x (j'ai déjà le la doc mais ca m'a pas très bien eclaircit)


 
c'est la méthode d'invocation de threads dans swing ...ca te garantit que tu va pas clasher avec le thread unique de swing...
 
c'est expliqué dans le swing tutorial du java tutorial
http://java.sun.com/docs/books/tut [...] reads.html
 
[:grilled] par le gourou :)


Message édité par Jubijub le 26-05-2005 à 16:28:10

---------------
Jubi Photos : Flickr - 500px
n°1098337
c0wb0y
:d
Posté le 26-05-2005 à 16:43:47  profilanswer
 

J'ai l'impression que cette methode invokeLAter() peut regler mes problemes de progress bar qui progresse pas ^^
 
J'ai en fait 2 méthodes dans ma classe MainFrame qui agissent sur un TextArea et l'autre sur la JProgressBar
 
elle sont déclarée en public void... mais ca n'affiche rien.
J'vais tester en adaptant avec invoke later :)

n°1098387
c0wb0y
:d
Posté le 26-05-2005 à 17:13:04  profilanswer
 

Citation :

Compiling 1 source file to D:\programmation\JavaApplication4\build\classes
D:\programmation\JavaApplication4\src\copepodtracker\MainFrame.java:396: local variable str is accessed from within inner class; needs to be declared final
                jTextArea1.setText(str);            
D:\programmation\JavaApplication4\src\copepodtracker\MainFrame.java:405: local variable i is accessed from within inner class; needs to be declared final
                jProgressBar1.setValue((int)((float)i/(float)max)*100);    
D:\programmation\JavaApplication4\src\copepodtracker\MainFrame.java:405: local variable max is accessed from within inner class; needs to be declared final
                jProgressBar1.setValue((int)((float)i/(float)max)*100);    
3 errors
BUILD FAILED (total time: 5 seconds)


 
J'avais bon espoir là pourtant  :cry:  
 
le code ou ca bloque :  
 

Code :
  1. public void afficher(String str){           
  2.         javax.swing.SwingUtilities.invokeLater(new Runnable() {
  3.             public void run(){
  4.                 jTextArea1.setText(str);           
  5.             }       
  6.         });
  7.     }
  8.    
  9.      
  10.     public void updateJProgressBar(int i, int max){
  11.         javax.swing.SwingUtilities.invokeLater(new Runnable() {
  12.             public void run(){
  13.                 jProgressBar1.setValue((int)((float)i/(float)max)*100); 
  14.                 //jProgressBar1.updateUI();
  15.             }
  16.         });
  17.     }


 
On voit bien que str, i et max ne sont absolument pas des variables locales mais des paramètres oO
 
je fais quoi ? :x

n°1098395
Cherrytree
cn=?
Posté le 26-05-2005 à 17:17:39  profilanswer
 

Tu les déclares final.


---------------
Le site de ma maman
n°1098400
nraynaud
lol
Posté le 26-05-2005 à 17:18:56  profilanswer
 

ça veut dire :
 public void updateJProgressBar(final int i, final int max){  


---------------
trainoo.com, c'est fini
n°1098477
c0wb0y
:d
Posté le 26-05-2005 à 17:51:43  profilanswer
 

je savais pas qu'on pouvait faire ça oO
 
Ca passe bien, mais ça n'a pas résolu mon pb, merde  :D

n°1098483
nraynaud
lol
Posté le 26-05-2005 à 17:58:02  profilanswer
 

public void afficher(final String str){      


---------------
trainoo.com, c'est fini
n°1098508
c0wb0y
:d
Posté le 26-05-2005 à 18:22:25  profilanswer
 

ouep c'est comme ça que j'ai fait pour les 2 méthodes, mais ca n'affiche toujours rien :x

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
code C dans une GUIPetit site -> bien ou pas ?
[Reglé] Prob de tableaux sous IE (mais pas sous Firefox bien sur)Sun Java Studio Creator, c'est bien ?
Créer un Thread, c'est bien et le fermer...?On me dit ... le javascript, c'est pas bien ...
OK avec Firefox, pas bien avec IE, pb dreamweaver menu déroulantsCmt savoir si PHP a bien load MySQL ?!
Developper une application windows.... 
Plus de sujets relatifs à : Bien développer sa GUI


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)