JProgressBar没有进展
所以我试图做一个下载器,显示进度条的下载进度。 但我有问题,因为它实际上并没有更新进度栏。 基本上它保持白色,当它是蓝色的。 如果有人可以帮忙,代码如下。
JProgressBar progressBar = new JProgressBar(0, ia); con.add(progressBar, BorderLayout.PAGE_START); con.validate(); con.repaint(); progressBar = new JProgressBar(0, ia); progressBar.setValue(0); System.out.print("Downloading Files"); while ((count = in.read(data, 0, downloadSpeed)) != -1){ fout.write(data, 0, count); if (count >= 2){ progressBar.setString("Downloading : " + ia + " @ " + count + "Kbs per second"); } else { progressBar.setString("Downloading : " + ia + " @ " + count + "Kb per second"); } progressBar.setValue(count); con.add(progressBar, BorderLayout.PAGE_START); try{ Thread.sleep(1000); } catch (Exception e){} }
与SwingWorker结合使用。 在这里看到一个例子: SwingWorker和Progress Bar
@ Hovercraft:你说得对。 请允许我参考相应的JavaDoc的SwingWorker页面 ,我认为这最好的解释了这种情况。
正如@happyburnout所指出的那样,你会更好地处理你在一个单独的线程下载,使用SwingWorker可能是你正在做的最好的解决scheme。
主要原因是阻止事件派发线程 (AKA EDT)运行,阻止任何重绘请求(和其他UI重要的事情)被处理。
你应该读一读
- Swing中的并发
- 工作者线程和摇摆工人
现在这几乎是从API文档中直接获取的,但给出了一个带有JProgressBar
的SwingWoker
的基本概念
“工人”…
public class Worker extends SwingWorker<Object, Object> { @Override protected Object doInBackground() throws Exception { // The download code would go here... for (int index = 0; index < 1000; index++) { int progress = Math.round(((float)index / 1000f) * 100f); setProgress(progress); Thread.sleep(10); } // You could return the down load file if you wanted... return null; }
“进度窗格”
public class ProgressPane extends JPanel { private JProgressBar progressBar; public ProgressPane() { setLayout(new GridBagLayout()); progressBar = new JProgressBar(); add(progressBar); } public void doWork() { Worker worker = new Worker(); worker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())) { progressBar.setValue((Integer) evt.getNewValue()); } } }); worker.execute(); } }
记住Swing的黄金法则
- 绝对不要永远不要从任何
Thread
除了EDT之外)更新UI组件 - 总是在不同的
Thread
上执行耗时的任务 - (有些东西,有些是关于布局经理的 – 这更像是个人的东西;))
你将与Swing一起快乐和轻松的时光:D