我搜索了这个问题,但我找到了几个文档,但它们太复杂了,无法理解。
我只想简单地让一个活动期间的进度条不起作用。
在我提供的示例代码中,进度条在运行方法完成后工作,而不是在此期间。当run方法工作时,如何更改此代码以更新进度条?
我想我必须创建一个新的线程来处理长期运行的方法,但我不知道该怎么做?
public class Gui extends JFrame {
private JProgressBar progressBar;
private JButton button;
public Gui() throws HeadlessException {
super("Progress bar");
setSize(500, 100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new FlowLayout());
add(resPan());
}
private JPanel resPan() {
JPanel resPan = new JPanel(new FlowLayout(FlowLayout.CENTER));
resPan.setPreferredSize(new Dimension(500, 100));
progressBar = new JProgressBar();
progressBar.setPreferredSize(new Dimension(180, 40));
button = new JButton("Action");
button.setPreferredSize(new Dimension(80, 40));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
progressBar.setIndeterminate(true);
run();
}
});
resPan.add(button);
resPan.add(progressBar);
return resPan;
}
private void run() {
try {
Thread.sleep(4000);
//progressBar.setIndeterminate(false);
} catch (InterruptedException e) {
e.printStackTrace();
}
}}
答案 0 :(得分:2)
是的,您必须创建一个新线程。否则,Swing无法显示任何新内容(例如更新进度条),因为Swing的线程仍然忙于您的run方法。 一个简单的方法是:
public void actionPerformed(ActionEvent arg0) {
progressBar.setIndeterminate(true);
new Thread(new Runnable() {
@Override
public void run() {
// do the long-running work here
// at the end:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progressBar.setIndeterminate(false);
}
);
}
).start();
}
请注意,progressBar必须声明为final才能在线程的runnable中使用。
答案 1 :(得分:1)
在SwingWorker java中,您可以找到这个确切的示例。
在Swingworker中运行的线程,正在使用SwingWorker#setProgress(int progress)
http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html