Bien développer sa GUI

Bien développer sa GUI - Java - Programmation

Marsh Posté le 12-05-2005 à 11:19:52    

Bonjour,
 
Voila, je bosse sur l'interface graphique de mon projet de java, que je réalise avec swing. Mais en cours je n'ai jamais vraiment vu comment developper des gui, donc les tp qu'on a fait sont bien trop légers pour aborder le problème correctement.
 
Je voudrais savoir quelles sont selon vous les trucs à faire pour avoir une gui utilisable et facile a developper?
 
Personenellement, je developpe chaque frame séparemment. J'ai ensuite une classe qui fait le traitment demandé par le logiciel (classe qui travaille avec le noyau de l'application). Et j'ai une classe 'FrameManager' qui fait le lien entre le traitement et les frame. Dans cette classe j'ai des méthodes (statique) qui me permette d'acceder au TextArea de la fenêtre principale par exemple, ou d'essayer de mettre a jour la ProgressBar.
 
Je dis essayer car en fait, ca ne fonctionne pas :\
Ya pas d'erreur de compil' ni d'execution, mais rien n'apparait dans les frames. Le frame manager se charge de lancer 2 threads (Traitement et MainFrame). C'est peut etre ca qui pose probleme ? Comme ma gui est dans un thread, j'y ai pas acces?
 
Merci de votre aide ;)


Message édité par c0wb0y le 12-05-2005 à 15:54:41
Reply

Marsh Posté le 12-05-2005 à 11:19:52   

Reply

Marsh Posté le 12-05-2005 à 15:54:58    

up :]
 
j'ai changé le titre qui était peut etre un peu trop repoussant ^^

Reply

Marsh Posté le 12-05-2005 à 16:59:59    

j'ai ma propre xp sur le dev de GUI/Swing à base de design patterns.. mais effectivement, j'suis à l'affut d'un site de reference si possible en français

Reply

Marsh Posté le 12-05-2005 à 18:29:11    

Ptit site sympa : http://www.dil.univ-mrs.fr/~garreta/java/EdiPol/


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 12-05-2005 à 20:05:40    

m'intéresse beaucoup également, notamment des infos sur l'analyse, la modélisation , le prototypage, l'ergonomie etc...


Message édité par EpoK le 12-05-2005 à 20:07:18
Reply

Marsh Posté le 13-05-2005 à 10:49:45    

Personne pour apporter une contribution ? Je doute qu'il n'y ait aucun ici qui aurait déja developper une gui en java  :p  

Reply

Marsh Posté le 13-05-2005 à 10:54:34    

De ce que je comprends de ton explication, tu utilises le pattern mediator pour centraliser autour de ton FrameManager les traitements et les accès à l'UI. C'est, je pense, un bon moyen d'éviter le couplage fort entre écrans de ton UI.
 
Pour ton problème de threads, un peu de code serait le bienvenu.


---------------
Le site de ma maman
Reply

Marsh Posté le 13-05-2005 à 11:11:57    

Heu, j'utilise pas de "pattern mediator" (pas trouvé dans la doc java) mais l'idée c'est ca oui.
 
Je poste ce qu'il faut pour comprendre le probleme avec la progressBar par exemeple :  
 
Dans la classe MainFrame, je déclare l'objet (c'est du netbeans, d'ou l'utilisation de javax.swing...)

Code :
  1. private javax.swing.JProgressBar jProgressBar1;


 
Quand le thread demare (appel de run())
j'instancie jProgressBar1 = new javax.swing.JProgressBar(0,100); et j'affiche mainFrame.

Code :
  1. public void run() {     
  2.        new MainFrame().setVisible(true);
  3.        jProgressBar1 = new javax.swing.JProgressBar(0,100);
  4.     }


 
Toujours dans la classe MainFrame, j'ai une methode qui est censée me permettre de mettre a jour la valeur de la progresBar:

Code :
  1. public void updateJProgressBar(int i, int max){
  2.         jProgressBar1.setValue((int)((float)i/(float)max)*100); 
  3.         jProgressBar1.updateUI();
  4.     }


 
 
Ensuite, dans la classe FrameManager
J'ai une methode qui fait le lien entre la frame et l'application :  

Code :
  1. public synchronized static void updateProgressBar(int i, int max){
  2.         mainFrame.updateJProgressBar(i,max);
  3.     }


(c'est cette methode qu'on appellera depuis les autres classes car elle est statique)
 
 
Dans la classe Traitement  
j'ai une methode lancerAnalyse() qui contient un boucle, ou j'effectue mes opérations.

Code :
  1. while((fileName = listeImage.readLine()) != null){
  2.    ...
  3.    FrameManager.updateProgressBar(i,imMoy.getNbFichier());
  4.    ...
  5. }


 
(i est bien initialisé / incrémenter, et imMoy.getNbFichier() retourne bien une valeur)
 
Le problème : la JProgressBar ne se met pas à jour :/
 
Merci de l'aide que vous pourrez m'apporter ^^

Reply

Marsh Posté le 13-05-2005 à 11:16:50    

Mediator est une façon de faire OO.
 
Ton problème est bien exposé. Mais je ne connais pas la solution.


---------------
Le site de ma maman
Reply

Marsh Posté le 13-05-2005 à 12:01:48    

J'ai déjà eu le problème avec la JProgressBar, j'avais pas eu le temps de résoudre le pb (c'était un projet à la con et il y avait plus important que la barre de progression) mais il me semble qu'il fallait faire un thread dédié à la MAJ de la progression de la barre ( :sweat: )
 
mais java et moi ça fait 2


Message édité par black_lord le 13-05-2005 à 12:02:12

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 13-05-2005 à 12:01:48   

Reply

Marsh Posté le 13-05-2005 à 14:12:06    

J'ai déja utiliser un jProgressBar pourtant, mais le programme était vraiment mal conçu (oui oui, c'est moi qui l'avait développé  :D ). Tout les attributs étaient "public static" et il n'y avait pas 2 grammes de poo dedans  :ange:  
 
Bref, je mettais donc directement à jour mon jpb depuis la méthode de traitement en y accedant explicitement (static partout roulaize . (ou pas))
 
La gui était la classe principale, et elle lançait le thread de traitement. Le jpb était donc dans la gui,sans thread à part, mais ca marchait =/
 
Enfin, vu le code, c'est clairement pas un bon exempmle  :ange:

Reply

Marsh Posté le 13-05-2005 à 17:13:53    

Reply

Marsh Posté le 13-05-2005 à 17:25:39    

Citation :


(c'est du netbeans, d'ou l'utilisation de javax.swing...)


décidément, toi http://simogeo.free.fr/hfr/pingouino_zytrafumai.gif


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 13-05-2005 à 22:32:04    

--  : Ce que je veux dire, c'est que lorsqu'on utilise netbeans pour developper l'interface graphique en visuel (en ajoutant visuellement les components au container) netbeans ne fais pas les imports nécessaires, mais à la place, il prefixe toute les classes avec javax.swing.JButton par exemple.
 
C'est peut etre configurable, à vrai dire je n'ai pas cherché, ca ne me pose pas problème  :)  
 
Par contre, si tu vois ou se trouve mon problème, ca me serait beaucoup plus utile  :D

Reply

Marsh Posté le 13-05-2005 à 22:33:35    

beemer : déjà lu cette page, je vois pas ce que je fais mal dans mon code par rapport à ce qu'il propose :\

Reply

Marsh Posté le 13-05-2005 à 22:41:30    

Ha pour casser y sont là les warlord du java, mais quand il est question de donner des conseils constructifs ya plus personne  :o

Reply

Marsh Posté le 13-05-2005 à 22:43:01    

c0wb0y a écrit :

--  : Ce que je veux dire, c'est que lorsqu'on utilise netbeans pour developper l'interface graphique en visuel (en ajoutant visuellement les components au container) netbeans ne fais pas les imports nécessaires, mais à la place, il prefixe toute les classes avec javax.swing.JButton par exemple.


ha autant pour moi :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 13-05-2005 à 22:48:03    

black_lord a écrit :

J'ai déjà eu le problème avec la JProgressBar, j'avais pas eu le temps de résoudre le pb (c'était un projet à la con et il y avait plus important que la barre de progression) mais il me semble qu'il fallait faire un thread dédié à la MAJ de la progression de la barre ( :sweat: )


google + swingworker, ça répond à 90% des cas où les gens veulent une barre de progression.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 13-05-2005 à 22:52:47    

au fait nraynaud, j'ai une question pour toi
(à laquelle je trouverais surement la réponse en mattant un peu les docs en question)
j'ai un TableModel qui met du temps à se remplir . qu'est-ce que je peux faire de malin pour pas que mon appli bloque apres le click dans le menu qui va afficher la table?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 13-05-2005 à 22:59:12    

the real moins moins a écrit :

au fait nraynaud, j'ai une question pour toi
(à laquelle je trouverais surement la réponse en mattant un peu les docs en question)
j'ai un TableModel qui met du temps à se remplir . qu'est-ce que je peux faire de malin pour pas que mon appli bloque apres le click dans le menu qui va afficher la table?


tu remplis les cases une par une ? dans ce cas, vire le tablemodel de la jtable, remplis-le et remets-le, parce que la propagation des évènements case par case doit bouffer de la ressource.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 13-05-2005 à 23:22:47    

non non, mais il est rempli par une requete sql qu'est pas hyper rapide quoua


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 13-05-2005 à 23:42:28    

the real moins moins a écrit :

non non, mais il est rempli par une requete sql qu'est pas hyper rapide quoua


tu fais un swingworker avec une barre de progression (attention, il faut quand même détacher le tablemodel comme j'ai dit avant si tu fais ça, et les opérations d'attachement/détachement doivent être faites dans le thread de swing) ?
 
sinon, tu peux bloquer swing en mettant un curseur d'attente ?
 
 
mais c'est incompressible, donc tu dois faire patienter l'utilisateur non ? j'ai mal compris ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 13-05-2005 à 23:45:10    

oui, le faire patienter mais pas en bloquant tout le bordel quoi. la barre de progression est sans doute la way to go, mais je ne sais pas estimer quand j'aurai fini.. enfin.
 
attachement/detachement = setTableModel(..) ?
donc le swingworker charge les données, construit le tablemodel, et me le laisse dispo quelque part, et je fais le setTM qque part en dehors du SW ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-05-2005 à 00:02:38    

Code :
  1. // pouet pouet dans le handler de l'évènement qui déclenche l'action
  2. final TableModel m = jTable.getModel();
  3. jTable.setModel(null);
  4. new Thread("updater de table", new Runnable() {
  5.   public void run(){
  6.     <ajouter une ligne à m>
  7.     <updater la barre avec swingutilities.invokelater()>
  8.     <ajouter une ligne>
  9.     ...
  10.     SwingUtilities.invokeLater(new Runnable() {
  11.       public void run() {
  12.         jTable.setModel(m);
  13.         <virer la barre qui sert plus>
  14.       }
  15.     });
  16. }).start();


 
un exemple avec une barre et un swingworker inutile :
http://java.sun.com/products/jfc/t [...] mple1.java


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-05-2005 à 00:04:43    

ah oui, il faut afficher la barre avant tout ça.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-05-2005 à 00:10:57    

nom de dieu


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-05-2005 à 00:18:21    

t'es pas obligé de faire aussi laid hein, j'ai tout emboité parce que comme ça le code apparaît dans l'ordre dans lequel il sera exécuté.
 
 
je t'ai montré les méthodes auto-protectrices ?

Code :
  1. public void calledFromAnywhere() {
  2.   if (!SwingUtilities.isEventDispatchThread()) {
  3.      SwingUtilities.invokeLater(new Runnable() {
  4.        public void run() {
  5.          calledFromAnywhere();
  6.        } 
  7.      });
  8.      return;
  9.   }
  10.   <travailler sur swing>
  11. }


 
[:dawa]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-05-2005 à 00:23:21    

ayan [:dawa]
 
bon, tuto, merde, et je veux bien faire éditeur, pour partager les sous parce qu'on le vendra bien sur


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-05-2005 à 00:27:44    

je t'ai dit aussi que dans jcoincoin y'a pas de panneau de config dans les sources ? [:dawa]
 
(la classe ConfigurationGui est en fait une factory statique :o)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-05-2005 à 04:07:03    

comme c'est joli :  les warlords java spamment/squattent les topics :D


Message édité par beemer le 14-05-2005 à 04:11:46
Reply

Marsh Posté le 14-05-2005 à 13:49:45    

nraynaud a écrit :

je t'ai dit aussi que dans jcoincoin y'a pas de panneau de config dans les sources ? [:dawa]
 
(la classe ConfigurationGui est en fait une factory statique :o)


euh url ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 14-05-2005 à 14:09:15    


http://nraynaud.com/jcoincoin/jcoincoin.jnlp l'application (options->open configuration)
http://opensvn.csie.org/jcoincoin/ [...] onGui.java la factory (bien dégueu, mais je manque de courage pour intervenir dessus tellement c'est le bordel)
 
http://opensvn.csie.org/jcoincoin/ [...] ibune.java une classe configurable.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-05-2005 à 14:15:54    

ha mais les trucs dégueux ça m'interesse pas :o
je crois que je 'lavais déjà vue, dans cette état


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 18-05-2005 à 15:54:59    

up ^^
 
(toujours pas réussi a faire fonctionner ces conneries -_-)
 
Est ce qu'utilise que des JFrame et donc aucun JPanel peut poser ce genre de problèmes ?
 
Sinon j'essayerai bien de creer la JFrame, puis de faire un JPanel qui prend toute la JFrame, et d'ajouter mes components dedans ?

Reply

Marsh Posté le 18-05-2005 à 16:16:35    

c0wb0y a écrit :


Sinon j'essayerai bien de creer la JFrame, puis de faire un JPanel qui prend toute la JFrame, et d'ajouter mes components dedans ?


 
Tu peux aussi faire plein de JPanel et les rajouter dans ta JFrame ... je veux dire que t'est pas  obligé de mettre tout d'abord dans un JPanel puis ce JPanel dans la JFrame.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 18-05-2005 à 18:05:03    

Mais d'un point de vue pratique, ca pourrait corriger mon probleme de progress bar qui progresse pas ? (:
 
(parceque bon, ca va me prendre du temps a tester, donc si c'est pour rien, le bad quoi :( )

Reply

Marsh Posté le 18-05-2005 à 18:09:23    

ça n'a pas de rapport.


---------------
Le site de ma maman
Reply

Marsh Posté le 24-05-2005 à 15:15:17    

Hop là
 
je réup (au lieu de créer un topic a chaque fois ;))
 
J'ai créé une Frame contenant 3 JComboBox
Ceux-ci sont instancié, vide, lors de l'appel de la méthode init() qui se charge de placer les Component.
 
Ensuite, l'utilisateur doit charger un fichier, puis j'en extrait des trajectoires.
Ces trajectoires je voudrais les mettre des les ComboBox (juste un label quoi)
 
Comme ya pas de methode addItem(Vector<?> V) j'ai réinstancier le ComboBox :  
 

Code :
  1. jComboBox1 = ComboBox(new Vector<Trajectoire>(listeTrajectoire)); //liste trajcectoire est une ArrayList


 
Après l'opération, je peux afficher en console le contneu du ComboBox (avec getItemAt()) mais dans la GUI, on ne voit pas les éléments :x
 
j'ai maté sur le net, et je pense qu'il faut mettre a jour la liste, mais je ne sais pas du tout comment le faire.

Reply

Marsh Posté le 24-05-2005 à 15:44:33    

C'est au niveau du model qui tu dois travailler. Laisse la vue tranquille, mais donne-lui un model de bonne facture, typiquement un DefaultComboBoxModel ou apparenté.


---------------
Le site de ma maman
Reply

Marsh Posté le 24-05-2005 à 15:53:38    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed