JProgressBar java

Résolu/Fermé
nico - 1 août 2006 à 13:50
 nico - 10 août 2006 à 14:32
Bonjour a tous,

soucis de JProgressBar et de Thread !
J'ai ecris un code qui lance une JProgressBar lorsque l'on clic sur un boutton ... La methode actionPerformed() reconnait mon boutton, et lance un nouveau thread pour l'update de la barre. Mais le soucis c'est que l'action de ce boutton ne se limite pas au lancement de la JProgressBar, et que celle-ci ne se met a jour qu'une fois que toute l'action liée au boutton est terminée !
Ce qui me parait contradictoire avec le fait que le thread devrait permettre de regler ce probleme !!

J'espere etre assez clair, en esperant que l'un de vous connaisse la solution !
merci
A voir également:

2 réponses

merci !
En fait j'ai deja commencé a bosser dessus, mais sans passer pas SwingWorker !
J'ai un probleme lié a l'EDT et au fait que j'utilise des fonctions de dessins ... je met le code au cas ou si quelqu'un aurait une solution pour le faire marcher correctement !


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.awt.geom.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;

public class TestProgressBar extends JFrame implements ActionListener {
    private JProgressBar jj;

    private DrawClass dc;
    private JButton b1;
    private final static int MAX_POINTS = 100;

    public TestProgressBar() {
        super();
        jj = new JProgressBar(0, MAX_POINTS);
        b1 = new JButton("Start");
        b1.addActionListener(this);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(b1);

        dc=new DrawClass(jj);
	getContentPane().setLayout(new BorderLayout());
        getContentPane().add(buttonPanel, BorderLayout.WEST);
        getContentPane().add(dc, BorderLayout.CENTER);
	getContentPane().add(jj, BorderLayout.SOUTH);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TestProgressBar dialog = new TestProgressBar();
                dialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		dialog.setSize(500,500);
                dialog.setVisible(true);
            }
        });
    }
  
    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();
        if (source == b1) {
            b1.setEnabled(false);
	    dc.setAction();
            jj.setValue(0);

            Thread t = new Thread(new Runnable() {
                public void run() {
                    dc.repaint();
                }
            });
            t.start();
        }
    }



    class DrawClass extends JPanel{
	private JProgressBar jpb;
	private boolean action=false;
	Graphics2D g2;


	public DrawClass(JProgressBar j){
	    jpb=j;
	}

	private void printPoint(final Point p, final Color c) {
	    SwingUtilities.invokeLater(new Runnable() {
		    public void run() {
			g2.setColor(c);
			Rectangle2D.Float rd = new Rectangle2D.Float(p.x,p.y,5,5);
			g2.fill(rd);
			System.out.println("point add: " + p);
		    }
		});
	}

	public void setAction(){
	    action=true;
	}
	
	public void paint(Graphics g){
	    g2 =(Graphics2D)g;
	    if (action){
		g2.clearRect(0,0,getSize().width,getSize().height);
		generatePoints();
	    }
	    else
		g2.clearRect(0,0,getSize().width,getSize().height);
	}

	private Random r = new Random();
	
	private void generatePoints() {
	    for (int i = 0; i < MAX_POINTS; i++) {
		Point p = randomPoint();
		Color c = randomColor();
		printPoint(p,c);
		updateBar(i+1);
		
		System.out.println("n:" + i);
		if (!SwingUtilities.isEventDispatchThread()) {
		    try {
			Thread.sleep(20);
		    } catch (Exception e) {
			e.printStackTrace();
		    }
		} else {
		    System.err.println("generate Point from EDT");
		}
        }
	    SwingUtilities.invokeLater(new Runnable() {
		    public void run() {
                b1.setEnabled(true);
		    }
		});
	}

	private void updateBar(final int i) {
	    SwingUtilities.invokeLater(new Runnable() {
		    public void run() {
			jpb.setValue(i);
			jpb.repaint();
			System.out.println("bar updated: " + i);
		    }
		});
	}
	private Point randomPoint() {
	    return new Point(r.nextInt(getSize().width), r.nextInt(getSize().height));
	}
	
	private Color randomColor() {
	    return new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
	}
    }



}
1
Utilisateur anonyme
10 août 2006 à 09:10
Salut!

Pour les tâches qui durent longtemps, utilise la classe SwingWorker.


Plutôt que de t'en expliquer le principe de fonctionnement, effectue une recherche sur "SwingWorker" avec un moteur de recherche et tu trouveras des exemples et démos.

Si tu ne t'en sors pas, fais-moi signe via le forum et je t'enverrai un exemple complet.

;-)
HackTrack
0