2013-03-06 45 views
-1

我已经在java中创建了一个ProgressBar。我可以使用pb.setValue(i)设置值;我是一个int 我很难设置“我”的值来增加进度条的值,以便在10秒内进度条在10秒内达到1%到100%。我怎样才能做到这一点 ?任何帮助,将不胜感激创建一个对时间有反应的进度条

+0

有没有雅刚刚发布了同样的问题,像20分钟前。 HTTP://stackoverflow.com/questions/15256762/progress-bar-that-takes-10-seconds-to-reach-100 ??。我们再次问你同样的问题,你试过了什么? – PermGenError 2013-03-06 20:19:20

+0

@ user1730355 - 请不要为同一个问题创建* new *问题;相反,编辑您的原始问题以使其更加清晰,并回答针对您的任何评论,然后将其标记为重新打开。 – LittleBobbyTables 2013-03-06 20:28:53

+0

我已经做了i ++的增量,但是它每秒都会做,我试图弄清楚我是否将它作为小数,并将其作为整数进行投射,但仍会得到不准确的读数。 – user1730355 2013-03-06 20:34:31

回答

1

您可以使用Timer

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JFrame; 
import javax.swing.JProgressBar; 
import javax.swing.Timer; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class TimerTest { 
public static void main(String[] args) { 

    final JFrame frame = new JFrame(); 
    final JProgressBar ps = new JProgressBar(); 
    final Timer timer = new Timer(100, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      int value = ps.getValue() + 1; 
      ps.setValue(value); 
     } 

    }); 

    ps.addChangeListener(new ChangeListener() { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      if (ps.getValue() == 100) { 
       timer.stop(); 
       frame.dispose(); 
      } 
     } 
    }); 
    frame.setSize(600, 400); 
    frame.add(ps); 
    frame.pack(); 
    frame.setVisible(true); 
    timer.start(); 
} 

}

0

调查java标准库有时间特定的功能,如此代码段。

long startTime = System.nanoTime(); 
methodToTime(); 
long endTime = System.nanoTime(); 

long duration = endTime - startTime; 

您可以设置结束和开始时间,以便根据实现代码的方式设置持续时间或10或1个部分。

+0

'nanoTime'可能有点过分,因为OP想要达到10秒,但这个概念是合理的。 – MadProgrammer 2013-03-06 20:41:24

0

您有多种选择,这里有两个。

您可以建立一个计时器,该计时器每秒钟滴答一次,直到滴答10次,或者您可以计算已经过去的时间量,并根据目标时间过去的时间生成一个进度值,流畅的进展......

public class ProgressOverTime { 

    public static void main(String[] args) { 
     new ProgressOverTime(); 
    } 

    public ProgressOverTime() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       GridBagConstraints gbc = new GridBagConstraints(); 
       gbc.gridwidth = GridBagConstraints.REMAINDER; 
       frame.add(new TestPane(), gbc); 
       frame.add(new TimeGapPane(), gbc); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private JProgressBar pb; 
     private int progress; 
     private int target = 10; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      pb = new JProgressBar(); 
      pb.setMaximum(10); 
      add(pb); 

      Timer timer = new Timer(1000, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        progress++; 
        if (progress > target) { 
         ((Timer)e.getSource()).stop(); 
        } 
        pb.setValue(progress); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

    } 

    public class TimeGapPane extends JPanel { 

     private JProgressBar pb; 
     private long startTime = -1; 
     private int target = 10000; 

     public TimeGapPane() { 
      setLayout(new GridBagLayout()); 
      pb = new JProgressBar(); 
      pb.setMaximum(100); 
      add(pb); 

      Timer timer = new Timer(40, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (startTime < 0) { 
         startTime = System.currentTimeMillis(); 
        } 
        long now = System.currentTimeMillis(); 
        long ticks = now - startTime; 

        float progress = (float)ticks/(float)target; 
        if (progress >= 1f) { 
         ((Timer)e.getSource()).stop(); 
         progress = 1f; 
        } 
        pb.setValue(Math.round(100f * progress)); 
       } 
      }); 
      timer.setRepeats(true); 
      timer.setCoalesce(true); 
      timer.start(); 
     } 

    } 

}