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

Composants Java Discussion :

Problème Intégration ProgressBar


Sujet :

Composants Java

  1. #1
    Membre averti Avatar de BenMitnicK
    Homme Profil pro
    Electricien d'Equipement Domestique et tertaire + Ingé en info
    Inscrit en
    Avril 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Electricien d'Equipement Domestique et tertaire + Ingé en info

    Informations forums :
    Inscription : Avril 2022
    Messages : 16
    Par défaut Problème Intégration ProgressBar
    Bonjour,

    J'ai un petit soucis d'intégration de ma progressbar avec mon code. J'avoue aussi que c'est la première fois que je code une progressbar j'en ai jamais fait et bien sur avant de venir vers vous j'ai étudier la chose fait énormément de test et d'intégration du code mais la je bloque complètement et j'avance plus donc je vous remercié d'être indulgent et de me donnée des explications pour que je ne puisse plus y revenir dessus et que ce soit acquis.

    Ma progressbar fonctionne parfaitement avec un bouton jusque la tout va bien. Je l'ai placé dans une Class que je fais appel quand j'en ai besoin.

    Dans mon exemple je fais des updates sur des tables avec sqlite et je voudrais intégrer cette progressbar.

    J'ai une JFrame avec des boutons et sur un bouton qui s'appel settings j'appel une JDialog ou a l'intérieur j'ai des options de couleur etc et lorsque je fini mes paramêtres j'appuie sur le bonton Save et la j'envoie mes requêtes Updates.

    Après envoie je ferme ma JDialog et la ma ProgressBar en JDialog doit apparaître hors je n'y arrive pas et en plus comme ce sont des requêtes je suis en mode indéterminé car ça duré 2 seconde comme 30 secondes.

    J'ai laisser en commentaire le test barbare que j'avais fais car impossible d'afficher la ProgressBar par contre avec un index en ++ dans le while elle s'affiche mais une fois que les requêtes sont terminé donc je sèche merci pour vôtre aide

    Voici mon code ProgressBar

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Image;
    import java.awt.Insets;
    import javax.swing.JDialog;
    import javax.swing.JLabel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingWorker;
    import java.beans.PropertyChangeEvent;
    import java.net.URL;
     
    public class BackgroundWorker extends SwingWorker<Void, Void> {
     
            public static JProgressBar pb;
            public static int index = 0;
            private JDialog dialog;
     
    public BackgroundWorker() {
     
        addPropertyChangeListener((PropertyChangeEvent evt) -> {
            if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
     
                if (dialog == null) {
                    dialog = new JDialog();
                    URL url = ClassLoader.getSystemResource("images/icon.png");
                    Image img = dialog.getToolkit().getImage(url);
                    dialog.setIconImage(img);
                    dialog.setLayout(new GridBagLayout());
                    dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                    //dialog.setAlwaysOnTop(true);
                    GridBagConstraints gbc = new GridBagConstraints();
                    gbc.insets = new Insets(2, 2, 2, 2);
                    gbc.weightx = 1;
                    gbc.gridy = 0;
                    dialog.add(new JLabel("Processing..."), gbc);
                    pb = new JProgressBar();
                    pb.setValue(0);
                    pb.setStringPainted(true);
                    gbc.gridy = 1;
                    dialog.add(pb, gbc);
                    dialog.pack();
                    dialog.setLocationRelativeTo(null);
                    dialog.setModal(true);
                    //JDialog.setDefaultLookAndFeelDecorated(true);
                    dialog.setVisible(true);
                }
                pb.setValue(getProgress());
            }
        });
        }
     
        @Override
        protected void done() {
            if (dialog != null) {
                dialog.dispose();
            }
        }
     
        @Override
        protected Void doInBackground() throws Exception {       
            //for (index = 0; index < 100 ; index++) {
            while(index<=100){
                setProgress(index);
                try{Thread.sleep(50);} // make the process last a while
                   catch (InterruptedException e){}
            //index ++;
            }
                //Thread.sleep(100);
           // }
        return null;
        }
     
    }
    Mon code Bouton Save

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void jb_SaveActionPerformed(java.awt.event.ActionEvent evt) throws IOException, SQLException {                                                           
                        int p = JOptionPane.showConfirmDialog(this, "Are Your Sure You Want To Save Your Configuration", "Confirmation",JOptionPane.OK_CANCEL_OPTION);
                        if(p == 0){
     
                        this.dispose();
                        new BackgroundWorker().execute(); 
                        SQLiteQueries.updateOptions();                   
               }                   
        }
    et une parti du code SQL car il y a 100 requêtes

    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
    public static void updateOptions() throws SQLException{		
    		try {        
                            //OptionsForm.index = 5;
                            PreparedStatement updateOptions;                    
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET Base=\"" +OptionsForm.CB_Base.getSelectedItem()+ "\"");
                                updateOptions.executeUpdate();
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET EditXboxData=\"" +OptionsForm.CB_EditXbox.getSelectedItem()+ "\"");
                                updateOptions.executeUpdate();
                                //OptionsForm.index = 10;
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET EditBodyData=\"" +OptionsForm.CB_EditBody.getSelectedItem()+ "\"");
                                updateOptions.executeUpdate();
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET AddCustomers=\"" +OptionsForm.CB_Customer.getSelectedItem()+ "\"");                            
                                updateOptions.executeUpdate();
                                //OptionsForm.index = 30;
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET Display=\"" +OptionsForm.CB_Display.getSelectedItem()+ "\"");
                                updateOptions.executeUpdate();
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET Mail=\"" +OptionsForm.CB_Mail.getSelectedItem()+ "\"");
                                updateOptions.executeUpdate();
                                //OptionsForm.index = 50;
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET TechMail=\"" +OptionsForm.t_EmailTechnician.getText()+ "\"");
                                updateOptions.executeUpdate();
                                String str = new String(OptionsForm.t_AppPassword.getPassword());
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET PassWordApp=\"" +str+ "\"");
                                updateOptions.executeUpdate();
                                //OptionsForm.index = 70;
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET SMTP=\"" +OptionsForm.t_SMTP_ADDRESS.getText()+ "\"");
                                updateOptions.executeUpdate();
                                updateOptions = connection.prepareStatement("UPDATE AppOptions SET PORT=\"" +OptionsForm.t_SMTP_PORT.getText()+ "\"");                            
                                updateOptions.executeUpdate();
                                //OptionsForm.index = 100;
                      } catch (SQLException e) {e.printStackTrace();}
        }

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 49
    Par défaut
    As-tu pensé à utiliser un Thread dédié pour l'affichage de ta barre de progression (cela permet le mode asynchrone);

  3. #3
    Membre chevronné
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 342
    Par défaut
    Je ne suis pas sur de comprendre ce qui ne fonctionne pas. Quel est le code qui est réellement utilisé ?

    Je ne vois pas de lien entre ces deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    new BackgroundWorker().execute(); 
    SQLiteQueries.updateOptions();
    Le worker doit recevoir une information de SQLiteQueries si vous voulez qu'il fasse quelque chose.

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    AWT / Swing utilise une boucle événementielle nommée EDT (event dispatch thread) qui sert a la fois a propager les événements en réaction aux actions utilisateurs et aux changements d'état des contrôles et a rafraîchir l'interface. L'EDT alterne donc constamment entre ces 2 états :
    • Propagation des événements et effectue des actions en reaction
    • Dessin de l'interface


    N'importe quelle code qui prend trop de temps a s’exécuter dans l'une ou l'autre des parties (ex : traitement super long suite a un click sur un bouton ou un rendu hyper complexe voir foire) perturbera le cycle et provoquera automatiquement l'un des symptômes suivants :
    • L'interface graphique ne répond plus aux actions de l'utilisateur, voir carrément ne se redessine plus tant que le long traitement n'est pas fini (cependant le programme refonctionnera a l'identique après).
    • Si on demande une mise a jour de l'interface graphique durant un traitement long, celle-ci ne pourra pas s'afficher et donc on passera de l’état 0 a l’état fini a la fin du traitement (ex : barre de progression).
    • Un code de rendu graphique bien naze (ex : boucle infinie) plantera totalement l'interface programme de manière permanente.


    Donc il faut :
    • S'assurer que les traitements longs soient déportés dans un ou plusieurs autres threads. Cela peut être fait via des threads custom, des executor, ou l'API dispo dans Swing : SwingWorker. Il existe probablement des libs tierces pour cela aussi.
    • L'EDT n'étant pas thread-safe, si possible gérer la création et le montage des composants graphiques sur l'EDT (voir : SwingUtilities.invokeLater()).
    • S'assurer que le code graphique custom ne soit pas un trou de performances (ex : il existe des moyen de redessiner uniquement des zones partielles de l’écran).
    • Dans le cadre de composants customs, agir de manière passive (ex : invoquer component.repaint(), puis ensuite dans component.paintComponent() peindre en fonction du nouvel état du composant) plutôt que active (j'ai gardé un graphics lié a l’écran sous la main et je dessine tout de suite dedans sans chercher a savoir s'il est encore valide)
    • Éviter les threads customs pour gérer l'affichage sauf si on sait vraiment ce qu'on fait ou si on doit dessiner une interface nécessitant des très grandes performances (real time, jeu video)
    • Si c'est des composants qu'on doit mettre a jour, leur laisser le temps de se redessiner et si possible modifier leur état sur l'EDT (voir : SwingUtilities.invokeLater()).


    Et quand rien s'affiche, au choix :
    • Comme dit précédemment, le traitement long ne laisse pas le temps a l'UI d’être redessinée par l'EDT.
    • On a oublié de connecter le traitement long effectué en tache de fond avec les notifications EDT pour indiquer que l'UI doit être redessinée.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Problème de ProgressBar dans une dll
    Par terminator59140 dans le forum C#
    Réponses: 6
    Dernier message: 02/06/2008, 19h26
  2. problème intégration son
    Par jicay57 dans le forum Intégration
    Réponses: 1
    Dernier message: 13/10/2007, 15h25
  3. [Flash] Problème intégration de police
    Par huguette dans le forum Flash
    Réponses: 6
    Dernier message: 10/06/2007, 23h45
  4. [XSLT] problème intégration d'applet dans une feuille XSL
    Par jymmy dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 25/03/2007, 15h01
  5. Problèmes intégrations Crystal V10
    Par audreyb dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/06/2005, 17h56

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