Update JProgressBar

后端 未结 6 1497
生来不讨喜
生来不讨喜 2021-01-22 21:43

I can\'t update my progressbar... this is my code

Thread t=new Thread(new Runnable(){
        public void run(){
            int i=1;
            jProgBar.setMin         


        
相关标签:
6条回答
  • 2021-01-22 21:44

    Use a model instead of the JProgressBar directly:

    DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
    JProgressBar bar = new JProgressBar(model);
    
    // Somewhere else, perhaps in another Thread
    model.setValue(i)
    

    The following example works fine:

    public static void main(String[] args) throws InterruptedException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200, 100);
        frame.setVisible(true);
        final DefaultBoundedRangeModel model = new DefaultBoundedRangeModel();
        frame.add(new JProgressBar(model));
        Thread t = new Thread(new Runnable() {
            public void run() {
                int i = 1;
                model.setMinimum(0);
                model.setMaximum(100);
                try {
                    while (i <= 100 || true) {
                        model.setValue(i);
                        i++;
                        Thread.sleep(50);
                    }
                } catch (InterruptedException ex) {
                    model.setValue(model.getMaximum());
                }
            }
        });
        t.start();
    
        Thread.sleep(2000);
    
        t.interrupt();
    }
    
    0 讨论(0)
  • 2021-01-22 21:44

    Per eugener, SwingWorker is definitely what you want to be using here, or any time a long-running task is spawned that could otherwise lock up your GUI prior to completion. A full tutorial on using progress bars with SwingWorker is available from Sun^H^H^HOracle here:

    http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

    0 讨论(0)
  • 2021-01-22 21:48

    Thanks All. I solved in this way

    try{
           jProgBar.setIndeterminate(true);
           jProgBar.setStringPainted(true);
           jProgBar.setBorderPainted(true);
           new Thread(new Runnable() {
               public void run() {
                   ...
                   // here is code that i've to wait
                   // after this i stop my jProgressBar
                   ...
                   jProgBar.setStringPainted(false);
                   jProgBar.setBorderPainted(true);
                   jProgBar.setIndeterminate(false);
           }
           }).start();
       }
       catch(IllegalStateException ex){
           //some code
       }
    
    0 讨论(0)
  • 2021-01-22 21:54

    Putting this snippet

    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            jProgBar.repaint();
        }
    }
    

    Between 'i++' and 'Thread.sleep()' should do the job. To get it compiling, mark jProgBar as 'final'.

    0 讨论(0)
  • 2021-01-22 21:55

    The best advice for your situation is to use SwingWorker. Check out the API at http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html

    Override process method to update value of progress bar ( then it will be done correctly on EDT)

    More info can be obtained at http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html

    0 讨论(0)
  • 2021-01-22 21:58

    Before the sleep, add a call to SwingUtilties.invokeLater() that spawns a thread to fire a firePropertyChange on the progressbar in the EDT.

    0 讨论(0)
提交回复
热议问题