如何使用 Swing Timer 延迟进度条的加载 [英] How to use the Swing Timer to delay the loading of a progress bar
问题描述
我需要找到一种方法来使用带有进度条的 Swing Timer.我尝试使用 Thread.sleep(),但是当我使用它时它使应用程序崩溃.有什么方法可以使用 Swing Timer 而不是 Sleep() 吗?
I need to find a way to use the Swing Timer with a progress bar. I tried using Thread.sleep(), but it crashed the app when I used it. Any ways to use the Swing Timer instead of the Sleep()?
public void piiEros(int dist)
{
Pii pii = new Pii();
pii.setVisible(true);
for(int pc = 0;100 > pc; pc++)
{
try {
Thread.sleep(dist/100);
} catch (InterruptedException ex) {
Logger.getLogger(Trav.class.getName()).log(Level.SEVERE, null, ex);
}
pii.pg.setValue(pc);
}
pii.dispose();
o.Eros();
}
注意:Pii 是一个带有进度条的类.Dist 是它加载的速度.Trav 是该方法所在的类.Pc 代表 %,在栏上显示完成了多少.o.Eros 打开另一个 GUI.
NOTES: Pii is a class with th Progress Bar. Dist is the speed at which it loads. Trav is the class the method is in. Pc stands for %, how much is done is displyed on the bar. o.Eros opens anotherr GUI.
推荐答案
使用 SwingWorker
可能更容易(从长远来看).它提供了许多有用的方法来更新 UI(从事件调度线程的上下文),同时允许在后台继续执行...
It's probably easier (in the long run) to use a SwingWorker
. It supplies a number of useful methods for updating the UI (from the context of the Event Dispatching Thread) while allowing to continue executing in the background...
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestSwingWorker02 {
public static void main(String[] args) {
new TestSwingWorker02();
}
public TestSwingWorker02() {
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 BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
JProgressBar pb = new JProgressBar();
add(pb);
new ProgressWorker(pb, 40).execute();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public class ProgressWorker extends SwingWorker<Void, Integer> {
private int delay;
private JProgressBar pb;
public ProgressWorker(JProgressBar progressBar, int delay) {
this.pb = progressBar;
this.delay = delay;
}
@Override
protected void process(List<Integer> chunks) {
// Back in the EDT...
pb.setValue(chunks.get(chunks.size() - 1)); // only care about the last one...
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < 100; index++) {
publish(index);
Thread.sleep(delay);
}
return null;
}
@Override
protected void done() {
// Back in the EDT...
//pii.dispose();
//o.Eros();
}
}
}
SwingWorker
允许您分离逻辑.在doInBackground
方法中你可以专注于需要在EDT之外操作的那部分代码,你可以publish
更新回EDT和process
代码>它们分开.全部完成
后,您可以根据需要进行清理.
The SwingWorker
allows you to separate the logic. In the doInBackground
method you can focus on that part of the code that needs to operate outside the EDT, you can publish
updates back to the EDT and process
them separately. When it's all done
you can clean up as required.
SwingWorker
还提供进度监控功能,因此,在您的情况下,您将不必使用 publish
/process
> API 的一部分,如果您不想.这将允许您将 PropertyChangeListener
附加到工作人员,而无需向其公开进度条.(但我做了这个例子)
SwingWorker
also provides a progress monitoring functionality, so, in your case, this would you wouldn't have to use the publish
/process
portion of the API if you didn't want to. This would allow you to attach a PropertyChangeListener
to a the worker without the need to expose the progress bar to it. (But I did for the example)
public class ProgressWorker extends SwingWorker<Void, Integer> {
private int delay;
private JProgressBar pb;
public ProgressWorker(JProgressBar progressBar, int delay) {
this.pb = progressBar;
this.delay = delay;
// You can use a property change listener to monitor progress updates...
addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equalsIgnoreCase(evt.getPropertyName())) {
pb.setValue((Integer)evt.getNewValue());
}
}
});
}
@Override
protected Void doInBackground() throws Exception {
for (int index = 0; index < 100; index++) {
setProgress(index);
Thread.sleep(delay);
}
return null;
}
@Override
protected void done() {
// Back in the EDT...
//pii.dispose();
//o.Eros();
}
}
这篇关于如何使用 Swing Timer 延迟进度条的加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!