简体   繁体   中英

How to refresh a progress bar in java?

I have tried to create this progress bar:

public class ProgressBar extends JFrame{

private JButton fine = new JButton("Chiudi");
final JProgressBar jp;
JPanel body;
JLabel banner1;
JLabel banner2;
JPanel testo;
JTextArea areatesto;
JPanel provapannello;
JTextArea provatesto;
JPanel pannellofine;

public ProgressBar() {
     super("loading");

    setSize(440, 400);
    setResizable(true);
    Container content = getContentPane();
    content.setBackground(Color.YELLOW);
    body = new JPanel();
    body.setLayout(new FlowLayout());
    ImageIcon image1 = new ImageIcon("prova1.png");
    banner1 = new JLabel();
    banner2 = new JLabel();
    banner1.setIcon(image1);
    JTextArea prova = new JTextArea("bar", 2, 40);
    prova.setBackground(Color.LIGHT_GRAY);
    prova.setLineWrap(true);
    body.add(banner1);
    body.add(prova);
    body.add(banner2);
    banner.setBounds(30, 80, 120, 120);
    testo = new JPanel();
    areatesto = new JTextArea("Attendi Per Favore, Sto Preparando Il Tuo PDF", 2, 33);
    areatesto.setLineWrap(true);
    testo.add(areatesto);
   ImagePanel progress_background = new ImagePanel("p.jpg"); 

    UIManager.put("ProgressBar.background", new Color(29, 29, 29));
    UIManager.put("ProgressBar.foreground", new Color(16, 95, 173));
    UIManager.put("ProgressBar.selectionBackground", new Color(214, 214, 214));
    UIManager.put("ProgressBar.selectionForeground", new Color(29, 29, 29));

    jp = new JProgressBar();
    jp.setUI(new BasicProgressBarUI());

    jp.setBounds(0, 205, 434, 25);
    jp.setMinimum(0);
    jp.setMaximum(100);
    jp.setStringPainted(true);
    jp.setBorder(null);
    progress_background.add(jp);
    provapannello = new JPanel();
    provatesto = new JTextArea("prova", 2, 70);


    provatesto.setBackground(Color.LIGHT_GRAY);
    provapannello.setBounds(0, 226, 500, 100);
    provapannello.add(provatesto);

    content.add(provapannello);
    content.add(progress_background);

    pannellofine = new JPanel();

    pannellofine.add(fine);
    pannellofine.setBounds(340, 330, 100, 100);
    pannellofine.setVisible(false);

    content.add(pannellofine);
    content.add(testo);

    content.add(body);
    Thread runner;
    jp.setValue(0);
    setVisible(true);
    public void setValue(final int j) {

    Runnable target = new Runnable() {
        @Override
        public void run() {
            jp.setValue(j);
        }
    };

    SwingUtilities.invokeLater(target);

}
    public static void main(String Args[]) {
    ProgressBar p = new ProgressBar();


    int i = 0;
    while(true){
        System.out.println("work");
        try {
            Thread.sleep(500);
        } catch (InterruptedException ex) { }

        p.setValue(i++);
    }
}

I have tried to change the value of the ProgressBar with the method "setValue" but the bar does not increase, "while" cycles to infinity, but I see no change. what's wrong?

I've stripped out most of the unnecessary code (and fixed your compilation errors), and your example works (I've changed the delay and increment, because again, for reproduction purposes you shouldn't waste people's time)

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;

public class ProgressBar extends JFrame {

    private JProgressBar progressBar;

    public ProgressBar() {
        super("loading");
        setSize(200, 100);
        Container content = getContentPane();
        content.setLayout(new BorderLayout());
        progressBar = new JProgressBar();
        progressBar.setMinimum(0);
        progressBar.setMaximum(100);
        progressBar.setStringPainted(true);
        progressBar.setBorder(null);
        content.add(progressBar, BorderLayout.SOUTH);
        setVisible(true);
    }

    void updateProgress(final int newValue) {
        progressBar.setValue(newValue);
    }

    public void setValue(final int j) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                updateProgress(j);
            }
        });
    }

    public static void main(final String Args[]) {
        ProgressBar myProgressBar = new ProgressBar();
        int i = 0;
        while (i <= 100) {
            System.out.println("" + i + "%");
            myProgressBar.setValue(i);
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                break;
            }
            i = i + 5;
        }
    }
}

You should really have invested the time in creating an SSCCE

Also on a side note, you should follow this advice when handling InterruptedExcetion s

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM