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

AWT/Swing Java Discussion :

[JProgressBar] Problème affichage lookandfeel


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut [JProgressBar] création look&Feel xml pour une JProgressBar
    Bonsoir,

    Je suis actuellement entrain de créer des statistiques dont le format de sorti est le PDF. Donc je souhaite passer la création dans un thread.

    Cela fonctionne niquel.

    Alors la seconde étape est de montrer à l'utilisateur l'état d'avancement de la création de rapport. Alors j'ai créer une class MaProgressBar.


    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
    package outils;
     
    import javax.swing.JProgressBar;
    import javax.swing.JSlider;
    import javax.swing.SwingWorker;
     
    public class MaProgressBar extends JProgressBar{
     
    	private Move move = null;
    	private JSlider sb = null ;
     
    	public MaProgressBar(){
    		super(0,100);
    		sb =  new JSlider(JSlider.HORIZONTAL, 0, 100, 60);
    		sb.setValue(0);
    		sb.setPaintTicks(true);
    		sb.setMajorTickSpacing(20);
    		sb.setMinorTickSpacing(5);
    		this.setModel(sb.getModel());
    		this.setValue(0);
    	}
     
    	public void setVisible(boolean b) {
            if (b) {
                if (move == null) {
                    move = new Move();
                    move.start();
                }
            } else {
                if (move != null) {
                    move.end();
                    move = null;
                }
            }
            super.setVisible(b);
        }
     
    	public JProgressBar getProgress(){
    		return this;
    	}
     
    	private class Move extends Thread {
            private boolean end = false;
     
            public void run() {
                try {
                    while (!end) {
                        sleep(10);
                        if (getProgress().getValue() < getProgress().getMaximum())
                            getProgress().setValue(getProgress().getValue() + 1);
                        else {
                            getProgress().setValue(0);
                        }
                        repaint();
                    }
                } catch (InterruptedException e) {
                    end();
                }
            }
            public void end() {
                this.end = true;
            }
    	}
    }

    Ensuite lors du clique sur un bouton je lance la création de rapport et j'initialise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaProgressBar.setVisible(true);
    Puis à la fin de la création du rapport j'initialise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaProgressBar.setVisible(false);
    Voici le thread lancé lors du clique


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    btnLancerStat.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent aevt){
    				new Thread() {
    	                                 public void run() {
    			                             MaProgressBar.setVisible(true);
                                                         fonctionCreationRapport();
        		                                     MaProgressBar.setVisible(false);
    	                                 }
    	                        }.start();
     
    		});

    Et cela ne m'affiche pas la MaProgressBar

    Si quelqu'un à une idée elle est la bienvenue


    Merci d'avance,

    Cordialement,

  2. #2
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 137
    Par défaut
    salut ,

    je pense que tu n'a pas attacher ta progressbar à un JFrame ou un JPanel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JFrame frameProgressBar=new JFrame();
    frameProgressBar.getContentPane.add(MaProgressBar)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Je viens de tester tous les threads de lancé donc Move et mon thread de création et cela fonctionne bien. Cela s'arrête au bon moment. Et le thread Move fonctionne très bien. Il se bien lance quand :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaProgressBar.setVisible(true);
    et s'arrête bien quand :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaProgressBar.setVisible(false);
    Donc c'est un problème d'affichage .



  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Si si, je l'ajoute à la place d'un ancien JLabel qui affichait du texte donc il est bien ajouter au JPanel qui lui est ajouté à ma JFrame

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Je viens de tester un truc qui ne donne pas grand chose :

    Voici les modifications faites :

    La méthode setVisible() de la class MaProgressBar est enlevée.

    Ensuite dans le thread de lancement de création de rapport :



    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
    new Thread() {
    	                public void run() {
     
    	                	MaProgressBar.setVisible(true);
     
    	                	for(int i = 0; i<10;i++){
     
    	                		MaProgressBar.setValue(i * 10);
    	                		MaProgressBar.repaint();
    	                		repaint();
     
    	                		System.out.println(i * 10);
    	                		try{   		            	
    	    		            	      sleep(2000);
    	    		                 }catch(Exception e){
    	    		            	      System.out.println("echec");
    	    		                }
    	                         }
     
                                     MaProgressBar.setVisible(false);
                           }
    }.start();

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Alors je viens te tester ma class en créer dans cette class une méthode main que voici :
    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
     
    public static void main(String[] s){
    		JFrame f = new JFrame("test");
    		final MaProgressBar mpb = new MaProgressBar();
    		JPanel jp = new JPanel();
     
    		f.getContentPane().add(mpb);
    		f.setVisible(true);
    		f.setLayout(new BorderLayout());
    		f.setBounds(0, 0, 200, 100);
    		jp.add(mpb);
    		f.add(jp,BorderLayout.CENTER);
     
    		mpb.setVisible(true);
    		new Thread(){
    			public void run(){
    				try{
    					sleep(5000);
    				}catch(Exception e){
    					System.out.println("echec");
    				}
    				mpb.setVisible(false);
    			}
    		}.start();
    	}
    Et cela fonctionne impeccable, ma progresse bar s'affiche et progresse lol.

    Ma question est donc la suivante :

    Est-ce qu'un objet non référencé dans le look and feel a des effets sur son affichage ??

  7. #7
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    repaint() est inutile, un setValue(...) suffit.

    La progression du JProgressBar doit se faire dans l'EDT, et pas dans un autre Thread.

    Pourquoi ne pas utiliser un SwingWorker qui simplifie tout ça ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Non mais, la progressbar fonctionne très bien. Le truc c'est que j'utilise cette class dans un autre projet qui lui fait réference à un look and feel. Et j'ai regardé à l'intérieur et la progressbar n'y figure pas. C'est peut-être pour ce que la progressbar s'affiche à partir du main de MaProgressBar et qu'elle ne s'affiche pas dans l'autre projet non ??

    Si c'est cela est-ce quelqu'un aurai un exemple de look and feel pour une JProgressBar ????

    J'ai commencé à chercher mais je ne trouve pas pour cette objet

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut [JProgressBar] création look&Feel xml pour une JProgressBar
    J'ai fais des recherches et je ne vois pas quoi mettre dans mon fichier XML afin d'afficher ma JProgressBar.

    Donc que dois-je mettre dans mon fichier xml pour afficher ma JProgressBar ??

    pour l'instant j'ai ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <style id="progressbar">
     
    		 // QUE DOIS-JE METTRE ICI ????
     
    </style>
    <bind style="progressbar" type="name" key="MaProgressBar"/>

    Merci d'avance,

    Cordialement

  10. #10
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    J'abonde dans le sens de visiwi, tu ne réalises pas le setValue de ta JProgressBar dans l'EDT, donc les résultats peuvent varier d'un L&F à l'autre car tu ne passes pas par le mécanisme de Swing prévu pour ça (ton setValue bypasse la pile d'exécution des events Swing, donc fout le bordel).

    CF la FAQ

    Et çà

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Donc çà ne serait pas à cause du LookAndFeel ??

    Car si je teste ma class hors du projet avec le look and feel, cela marche très bien, l'affichage et la progression de la bar.

    C'est que lors que j'utilise dans le projet avec le LAF que cela ne s'affiche pas. Pour tous les threads fonctionnent IMPEC. Il manque juste l'affichage dans un look and feel

  12. #12
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Voici un exemple "bien programmé" dans le sens où les appels Swing sont effectués dans l'EDT. Ajoute ton LAF dans le main et teste le. Il est probable que l'affiche soit correct.

    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
    74
    75
    76
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;
     
    public class Essai implements ActionListener {
     
    	private JButton start = new JButton("start");
    	private JProgressBar progress = new JProgressBar();
     
    	public static void main(String[] args) {
    		new Essai();
    	}
     
    	public Essai() {
    		JFrame f = new JFrame("test");
    		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		start.addActionListener(this);
    		progress.setStringPainted(true);
     
    		f.setLayout(new FlowLayout());
    		f.add(progress);
    		f.add(start);
     
    		f.pack();
    		f.setLocationRelativeTo(null);
    		f.setVisible(true);
    	}
     
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		Runnable code = new Runnable() {
    			@Override
    			public void run() {
    				start.setEnabled(false); // exécuté dans l'EDT
    				progress.setString(null);
    			}
    		};
    		EventQueue.invokeLater(code);
    		Thread thread = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				for (int i = 1 ; i<= 100 ; i++) {
    					final int n = i;
    					Runnable code = new Runnable() {
    						@Override
    						public void run() {
    							progress.setValue(n); // exécuté dans l'EDT
    						}
    					};
    					EventQueue.invokeLater(code);
    					try {
    						Thread.sleep(20);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    				Runnable code = new Runnable() {
    					@Override
    					public void run() {
    						progress.setValue(0);
    						progress.setString("terminé");
    						start.setEnabled(true); // exécuté dans l'EDT
    					}
    				};
    				EventQueue.invokeLater(code);
    			}
    		});
    		thread.start();
    	}
     
    }

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    Niquel çà marche impeccable merci beaucoup, mais par contre je comprend toujours pas pourquoi toi çà fonctionne et pas moi.

    Vous entendez quoi par EDT ???

    Enfaite faut créer un thread pour chaque modification de la JProgressBar si j'ai bien compris ??

    Et c'est quoi la différence entre une Thread et un Runnable ?? car je ne vois pas trop.

  14. #14
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Réfères toi au lien que je t'ai donné plus haut

  15. #15
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Citation Envoyé par matthieu86 Voir le message
    par contre je comprend toujours pas pourquoi toi çà fonctionne et pas moi.
    Vous entendez quoi par EDT ?
    Le lien que t'as indiqué sinok t'explique justement le pourquoi et le comment.

    Citation Envoyé par matthieu86 Voir le message
    En faite faut créer un thread pour chaque modification de la JProgressBar si j'ai bien compris ?
    Non, tu as mal compris. Si tu regarde bien l'exemple que j'ai fourni, il n'y a qu'un seul Thread (il simule une tâche longue), son utilité est de ne pas bloquer l'appli. Mais a chaque fois que tu met à jour la progressBar cela est fait dans l'EDT : EventQueue.invokeLater(code);. Cela permet d'éviter quelques désagrémments (comme tu as eu), mais aussi d'avoir des interfaces plus réactive.
    Par contre l'EDT est lui-même un Thread.


    Citation Envoyé par matthieu86 Voir le message
    Et c'est quoi la différence entre une Thread et un Runnable ??
    Sur developpez.com, il y a de nombreux tuto sur les Thread...

    Tout cela ne se fera pas avec une lecture vite fait. C'est un vaste sujet, il faut du temps...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut
    D'accord, je vais étudier çà, merci beaucoup pour vos aides !!!

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut Problème LookAndFeel Xml pour JProgressBar !!!
    Donc la j'ai un autre problème, je souhaiterai donc donner mon style perso à ma JProgressBar. Pour cela j'utilise un look and feel et je charge un fichier XML qui est en pièce jointe.

    Pour la JProgressBar j'ai rajouter ce qui est en bas de page. C'est à dire ceci :

    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
    <style id="vegasProgressBar">
     
      		<font id="fontP" name="Tahoma" size="20"/>
     
    		<object class="javax.swing.plaf.ColorUIResource" id="selectBack">
                               <int>0</int>
                               <int>0</int>
                               <int>255</int>
                    </object>
     
    		<object class="javax.swing.plaf.ColorUIResource" id="selectFore">
                               <int>0</int>
                               <int>255</int>
                               <int>0</int>
                    </object>
     
    		<object class="javax.swing.plaf.ColorUIResource" id="shadow">
                              <int>0</int>
                              <int>255</int>
                              <int>0</int>
                    </object>
     
    		<imagePainter method="progressbarBackground" path="images/progressbar.png" sourceInsets="0 0 0 0" paintCenter="true" stretch="true"/>
     
    		<defaultsProperty key="ProgressBar.horizontalSize" type="dimension" value="5 5" />	
    		<defaultsProperty key="ProgressBar.repaintInterval"	 type="integer" value="5" />
    		<defaultsProperty key="ProgressBar.selectionBackground" type="idref" value="selectBack" />	
    		<defaultsProperty key="ProgressBar.selectionForeground" type="idref" value="selectFore" />
    		<defaultsProperty key="ProgressBar.shadow" type="idref" value="shadow" />
    		<defaultsProperty key="ProgressBar.verticalSize" type="dimension" value="5 5" />
    		<defaultsProperty key="ProgressBar.cellLength" type="integer" value="9" />
    		<defaultsProperty key="ProgressBar.cellSpacing" type="integer" value="1" />
    		<defaultsProperty key="ProgressBar.font" type="idref" value="fontP" />
     
      </style>  
      <bind style="vegasProgressBar" type="name" key="VegasProgressBar"/>
    Et le problème c'est qu'il y a que le painterImage qui fonctionne, c'est à dire que l'image que je met s'affiche bien en fond de ma JProgressBar. Par contre la font et les couleurs ne fonctionne pas, je ne comprend pas pourquoi . Par ce que le painterImage fonctionne.

    Sinon que dois-je ajouter pour que la bar de progression s'affiche ??

    j'ai vu ce lien : http://www.java2s.com/Tutorial/Java/...ookandFeel.htm

    et j'ai tout testé mais cela ne fonctionne pas je ne vois pas quoi rajouter pour afficher la bar de progression.

    Merci d'avance,

    Cordialement
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Problème affichage JProgressBar/Thread/.bat
    Par davly dans le forum Général Java
    Réponses: 3
    Dernier message: 13/03/2012, 10h59
  2. Problème affichage JProgressBar
    Par bibi7373 dans le forum Composants
    Réponses: 0
    Dernier message: 17/02/2012, 16h13
  3. Problème affichage primitive
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 29/12/2004, 19h25
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 15h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 14h31

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