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
    51
    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 : 51
    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
    348
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 348
    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 909
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : Nouvelle-Cal�donie

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

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 6 909
    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