IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Mise a jour d'une vue


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre confirmé Avatar de pierrot2908
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut Mise a jour d'une vue
    Voila je n'arrive pas a mettre la vue a jour 2 fois pour un meme evenement
    voila mon code
    Si quelqu'un a une idée...
    Merci

    public void suivant()
    {
    setChanged();
    notifyObservers("lancer");
    creationRepertoire("test","../blast/test");
    creationRepertoire("présentation","../blast/présentation");
    creationRepertoire("application","../blast/application");
    creationRepertoire("aide","../blast/aide");
    creationRepertoire("banques","../blast/banques");
    creationRepertoire("fichRequete","../blast/fichRequete");
    creationRepertoire("resultats","../blast/resultats");
    creationRepertoire("verification","../blast/verification");
    creationRepertoire("doc","../blast/doc");
    creationRepertoire("bin","../blast/bin");
    creationRepertoire("data","../blast/data");
    creationRepertoire("blasts","../blast/blasts");
    setChanged();
    notifyObservers("terminer");

    }

  2. #2
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Tu peux être un peu plus explicite ? Tu attends quoi et ça fait quoi ?

  3. #3
    Membre confirmé Avatar de pierrot2908
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    en faite je fais un petit setup, je créé mes repertoires puis copie les fichiers qu'ils contiennent.
    J'ai fais une animation gif (une barre de chargement qui bouge pour montrer le chargement) et lorsque la copie est finie se bloque a 100% et j'ai le bouton terminer qui s'active.
    Cependant seul la derniere modification est prise en compte

  4. #4
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 110
    Par défaut
    vue comme tu le dis, j'ai l'impression qu'il faut un
    (meme si je ne sais pas comment ca marche)
    entre chaque creation de repertoire.


    On ne pourra pas en dire plus sans savoir comment fonctionne ton systeme.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    une petite idée... est ce que par hasard, ta méthode "suivant" serait appelée par le thread graphique, sur l'appui d'un bouton par exemple ?

  6. #6
    Membre confirmé Avatar de pierrot2908
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    oui c'est ca...
    enfin il me semble je l'appel sur l'appui du bouton suivant que j'abonne par : bouton.addActionListener(ctrl);

  7. #7
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    alors ça explique.. en fait aucun rafraichissement graphique ne se fera tant que du code appelé par le thread graphique est en cours d'execution.

    En clair, tu dois:
    - créer une classe contenant un thread secondaire pour faire le travail
    - cette classse doit générer des événements
    - tu t'y abonnes
    - sur réception des événement, tu resynchronizes avec le thread graphique en utilisant SwingUtilities.invokeLater(...)

    l'autre possibilité, toujours avec le thread secondaire, c'est de créer un monitor avec le javax.swing.Timer, et intérroger régulièrement l'état de ton thread secondaire

    voila voila, bon courage !!

  8. #8
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    au fait, pour l'autre sujet "Libération de mémoire " si tu as ta réponse, il serait bon de clore le sujet. Ca vaut d'une façon générale pour tous les sujets ouverts, merci d'y faire attention ;-)

  9. #9
    Membre confirmé Avatar de pierrot2908
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    je suis dsl je débute en java, je ne comprend pas tout
    je te donne mes sources je pense que tu comprendra peut etre mieu
    /**
    *
    */
    package modele;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    import java.util.Observable;

    import javax.swing.JFileChooser;




    /**
    * @author Pierre
    *
    */
    public class Modele extends Observable
    {
    private String cheminInstal = "C:/";

    /**
    *
    */
    public Modele()
    {
    // TODO Auto-generated constructor stub
    }


    /** Cette méthode permet de parcourir l'arboraisance pour installer blast
    *
    *
    */
    public void parcourir()
    {
    JFileChooser choose = new JFileChooser();

    choose.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    choose.setDialogTitle("Choix de la base de donnée blast");
    int choix = choose.showSaveDialog(null);
    File fichier = null;
    if (choix == JFileChooser.APPROVE_OPTION)
    {
    fichier = choose.getSelectedFile();
    cheminInstal = fichier.getAbsolutePath();
    setChanged();
    notifyObservers("instal");
    }
    else
    System.out.println("L'ouverture de fichier est annulée");

    }


    public String getChemin()
    {
    return cheminInstal;
    }


    public void quitter()
    {
    System.exit(0);

    }


    public void suivant()
    {


    creationRepertoire("test","../blast/test");
    creationRepertoire("présentation","../blast/présentation");
    creationRepertoire("application","../blast/application");
    creationRepertoire("aide","../blast/aide");
    creationRepertoire("banques","../blast/banques");
    creationRepertoire("fichRequete","../blast/fichRequete");
    creationRepertoire("resultats","../blast/resultats");
    creationRepertoire("verification","../blast/verification");
    creationRepertoire("doc","../blast/doc");
    creationRepertoire("bin","../blast/bin");
    creationRepertoire("data","../blast/data");
    creationRepertoire("blasts","../blast/blasts");
    creationRepertoire("images","../blast/images");
    creationRepertoire("images/aide","../blast/images/aide");
    copier("../blast/blastall.bat", cheminInstal+"/blast" , "blastall.bat");
    copier("../blast/ReadMe.html", cheminInstal+"/blast" , "ReadMe.html");
    setChanged();
    notifyObservers("terminer");


    }


    /** Permet la création des répertoire
    *
    * @param nom
    * @param chemin
    */
    private void creationRepertoire(String nom, String chemin)
    {
    Thread copie = new Thread();
    copie.start();
    setChanged();
    notifyObservers("lancer");
    File rep = new File(cheminInstal+"/blast/"+nom);
    rep.mkdirs();
    File repAvant = new File(chemin);
    if (repAvant.listFiles()!=null)
    {
    File[] fic = repAvant.listFiles();
    for(int i = 0 ; i< fic.length; i++)
    {
    if(fic[i].isFile())
    {
    System.out.println("copie de : " + fic[i].getName());
    copier(fic[i].getAbsolutePath(),rep.getAbsolutePath(), fic[i].getName());
    }
    else System.out.println("C'est un repertoire : "+ fic[i].getName());
    }
    }
    copie.stop();
    }


    private void copier(String cheminFichier, String cheminFinal, String name)
    {
    FileChannel in = null; // canal d'entrée
    FileChannel out = null; // canal de sortie

    try {
    // Init
    in = new FileInputStream(cheminFichier).getChannel();
    out = new FileOutputStream(cheminFinal+"/"+ name).getChannel();

    // Copie depuis le in vers le out
    in.transferTo(0, in.size(), out);
    } catch (Exception e) {
    e.printStackTrace(); // n'importe quelle exception
    } finally { // finalement on ferme
    if(in != null) {
    try {
    in.close();
    } catch (IOException e) {}
    }
    if(out != null) {
    try {
    out.close();
    } catch (IOException e) {}
    }
    }
    }

    }


    /**
    *
    */
    package vue;

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;

    import modele.Modele;

    /**
    * @author Pierre
    *
    */
    public class Controleur implements ActionListener
    {
    private Modele mdl = new Modele();
    /**
    *
    */
    public Controleur(Modele mdl)
    {
    this.mdl = mdl;
    }






    public void actionPerformed(ActionEvent arg0)
    {
    if(arg0.getSource() instanceof JButton)
    {
    JButton bouton = (JButton) arg0.getSource();
    if (bouton.getName().equals("Parcourir")) mdl.parcourir();
    else if(bouton.getName().equals("Suivant")) mdl.suivant();
    else if(bouton.getName().equals("Annuler")) mdl.quitter();
    else if(bouton.getName().equals("term")) mdl.quitter();
    }

    }

    }


    package vue;

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.GridLayout;
    import java.util.Observable;
    import java.util.Observer;

    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;



    import modele.Modele;

    public class VueSetup extends JPanel implements Observer
    {

    /**
    *
    */
    private static final long serialVersionUID = 1L;
    private Modele mdl = new Modele();
    private Controleur ctrl = new Controleur(mdl);
    private JTextField champ;
    private JLabel barre;
    private JButton terminer;
    /** Le constructeur par defaut */
    public VueSetup()
    {
    setLayout(new BorderLayout());
    setBackground(Color.WHITE);
    add(head(), BorderLayout.NORTH);
    add(panCentre(), BorderLayout.CENTER);
    add(barreAvancement(), BorderLayout.SOUTH);
    mdl.addObserver(this);
    }


    private JPanel panCentre()
    {
    JPanel pan = new JPanel();
    pan.setOpaque(false);
    pan.setLayout(new GridLayout(2,1));
    pan.add(ligneSaisie());
    pan.add(ligneBouton());
    return pan;
    }


    private JPanel ligneBouton()
    {
    JPanel bouton = new JPanel();
    bouton.add(nouveauBouton("Suivant"));
    bouton.add(nouveauBouton("Annuler"));
    terminer = new JButton("Terminer");
    terminer.setEnabled(false);
    terminer.setName("term");
    terminer.addActionListener(ctrl);
    JPanel panTotal = new JPanel();
    panTotal.add(bouton);
    panTotal.add(terminer);
    bouton.setOpaque(false);
    panTotal.setOpaque(false);
    return panTotal;
    }



    private JButton nouveauBouton(String name)
    {
    JButton bout = new JButton(name);
    bout.setName(name);
    bout.addActionListener(ctrl);
    return bout;
    }




    private JLabel barreAvancement()
    {
    barre = new JLabel(new ImageIcon("images/chargement0.JPG"));
    return barre;
    }


    /** Rend un panneau contenant une zone de texte et un bouton
    * @return le panneau
    * */
    private JPanel ligneSaisie()
    {
    JPanel pan = new JPanel();
    pan.setOpaque(false);
    pan.setLayout(new GridLayout(1,2));
    champ = new JTextField("C:/");
    champ.setForeground(Color.MAGENTA);
    champ.setEditable(false);
    champ.setColumns(20);
    JButton bout = new JButton("Parcourir");
    bout.setName("Parcourir");
    bout.addActionListener(ctrl);
    pan.add(champ);
    pan.add(bout);
    JPanel panTotal = new JPanel();
    panTotal.add(pan);
    panTotal.setOpaque(false);
    return panTotal;
    }



    /** Création du label explicatif
    * @return le label
    * */
    private JLabel head()
    {
    JLabel head = new JLabel(new ImageIcon("images/explication.gif"));
    return head;
    }




    public void update(Observable arg0, Object arg1)
    {
    if (arg0 instanceof Modele && arg1!=null)
    {
    mdl = (Modele) arg0 ;
    String nomType = arg1.toString() ;
    if (nomType.equals("instal")) champ.setText(mdl.getChemin());
    else if (nomType.equals("lancer")) barre.setIcon(new ImageIcon("images/barre.gif"));
    else if (nomType.equals("terminer"))
    {
    barre.setIcon(new ImageIcon("images/chargement100.JPG"));
    terminer.setEnabled(true);
    }
    }
    }

    }


    /**
    *
    */
    package test;


    import java.awt.event.WindowAdapter;

    import javax.swing.JFrame;

    import vue.VueSetup;;


    /**
    * @author Pierre
    *
    */
    public class FenetreSetup extends JFrame
    {

    /** Numéro de sérialisation. */
    private static final long serialVersionUID = 1L;
    /*_________________________________________________________________________________*/
    /** Création de la fenêtre principale.
    * @param p Le panneau à placer dans la fenêtre.
    * @param screensize
    */
    public FenetreSetup(VueSetup p)
    {
    java.awt.GraphicsEnvironment graphicsEnvironment =
    java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
    setName("Blast") ;
    setTitle("Blast : Setup") ;

    int x = graphicsEnvironment.getCenterPoint().x - getWidth() / 2;
    int y = graphicsEnvironment.getCenterPoint().y - getHeight() / 2;
    setLocation(x,y);

    setSize(800,400) ;
    getContentPane().add(p) ;
    setVisible(true);
    // /* Change le logo de java par une image personnelle (le logo en haut de la fenêtre */
    // Image icone = Toolkit.getDefaultToolkit ().getImage("images/logoAccueil.jpg");
    // this.setIconImage (icone);

    addWindowListener(new WindowAdapterTest());
    }

    /*___________________________________________________________*/
    /*_________________________________________________________________________________*/
    /** La classe interne qui servira d'adaptateur à la fenêtre principale pour gérer
    * ce qui doit être fait avant que la fenêtre ne soit quittée.
    */
    public class WindowAdapterTest extends WindowAdapter
    {
    /*_________________________________________________________________________________*/
    /** Permet de réaliser des opération indispensables avant la fermeture de la fenêtre.
    * Dans cette application il n'y a rien à faire. Nous afficherons simplement sur la
    * console que l'application se termine.
    * @param e L'événement qui provoque la fermeture de la fenêtre.
    * @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
    */
    public void windowClosing(java.awt.event.WindowEvent e)
    {
    System.out.println("fin de l'application") ;
    System.exit(0);
    }
    }

    /*___________________________________________________________*/
    }
    voila il ne manque que le main

  10. #10
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    bon, déjà, même si je ne l'ai pas utilisée jusqu'à maintenant, je crois que tu devrais utiliser la fonction "pièce jointe" dispo dans la création des réponses, qui s'applique certainement bien pour éviter des cut&paste de code un peu trop long.

    en dehors de ça, effectivement, tout ton code est exécuté par le thread graphique, c'est donc normal que tu n'aies ton rafrachissement que lorsque tout le travail est terminé. D'ailleurs, pendant la création de tes répertoires et autres fichiers, si tu essayes de déplacer ta fenêtre ou la masquer et la démasquer, tu verras bien cet effet: tout est figé.

    faire un cours de programmation multi thread, c'est un peu long pour entrer dans le post d'un forum... peut être faudrait-il prendre un bouquin ?

    bon en deux mots:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    class MaClassGraphique implements ActionListener{
     
     private Timer timer;
     private Worker worker;
     private JButton suivant;
     
     public void actionPerformed(...) {
      Object source = e.getSource();
      if (source==suivant){
       suivant.setEnabled(false);
       worker = new Worker();
       timer = new Timer(200,this);
       timer.start();
       worker.start();
      }
      else if (source==timer){
        int progress = worker.getProgress();
        if (progress == 100){
         // mettre à jour l'interface sur fin de travail (bouton ok a valider ?)
         myProgressBar.setVisible(false);
         suivante.setEnabled(true);
         timer.stop();
        }
        else{
          myprogressBar.setValue(progress);
        }
      }
     }
    }
     
    //////////////////////
     
    class Worker extends Thread{
     
     private int progress = 0;
     
     public int getProgress(){
      return progress;
     } 
     
     public void run(){
       while(!finished){
       // .. faire un peu de boulot
       // .. mettre à jour l'avancement     
       }
     }
    }


    voila pour les principes, je n'ai pas cherché à compiler ça, mais à peu de choses près, ça doit passer.

  11. #11
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    oui un truc encore, juste faire attention dans le design proposé, que la valeur progress atteigne toujours 100 d'une façon ou d'une autre, ou pouvoir s'arrêter sur un autre évenement, genre exception par exemple.

    Si tu veux en effet gérer une erreur, possible dans le "run", il faut aussi faire une méthode du genre "getLastError", et ton timer appellera la progression courante mais aussi la récupération de la dernière erreur rencontrée

  12. #12
    Membre confirmé Avatar de pierrot2908
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    je suis pas trop informaticien mais plutot biologiste, donc je croi que je vais me contenté du Jlabel, je vous remerci pour votre aide

  13. #13
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 52
    Par défaut
    se contenter du JLabel.. ma foi, je ne vois pas trop en quoi ça consiste comme solution, mais en effet, ce que tu cherches à obtenir ne peut pas se passer d'un minimum de programmation multi thread.

    pense à passer le post en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Régle de mise à jour d'une vue
    Par billybob2 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/06/2011, 15h50
  2. Mise a jour d'une vue SQL via LinqData
    Par Tardiff Jean-François dans le forum Accès aux données
    Réponses: 0
    Dernier message: 31/07/2008, 17h47
  3. "Mise à jour" d'une vue
    Par mostro_600 dans le forum SQL
    Réponses: 6
    Dernier message: 18/06/2007, 17h24
  4. [SWT] Mise à jour d'une vue
    Par Nikk0 dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 16/06/2007, 13h13
  5. [FORMS6] : mise à jour d'une vue
    Par gaultier dans le forum Forms
    Réponses: 13
    Dernier message: 03/07/2006, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo