我创建了一个表单,其中有两个组件,按钮和进度条(Netbeans拖放).Form包含我的应用程序启动的主要方法。我已经创建了另一个类,其中我编写了一个函数。我想要的是,当我按下一个按钮时,应用程序进入该功能,进度条与其同时运行,当该功能完成其功能时,进度条显示100%完成。现在该功能可以随时使用完成所以我无法设置进度条的最大值。那么,在这种情况下该怎么办?任何人都可以给我一个很好的例子。
答案 0 :(得分:4)
答案 1 :(得分:4)
由于你在所谓的“被调用函数”中正在做什么样的工作,所以很难说,你想要在场景中想要什么,尽管你可以像progressBar.setValue(someProgress);
那样定期使用你的行。它是Indeterminate State
到true
,在功能结束时你可以简单地说progressBar.setValue(100);
和Indeterminate State
会转到false
这里,以便它可以向最终用户显示。
看看这个示例程序:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ProgressExample
{
public static JProgressBar progressBar;
private void createAndDisplayGUI()
{
JFrame frame = new JFrame("Progress Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout(5, 5));
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
JButton button = new JButton("START");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
progressBar.setIndeterminate(true);
WorkingDialog wd = new WorkingDialog();
wd.createAndDisplayDialog();
}
});
contentPane.add(progressBar, BorderLayout.PAGE_START);
contentPane.add(button, BorderLayout.PAGE_END);
frame.setContentPane(contentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ProgressExample().createAndDisplayGUI();
}
});
}
}
class WorkingDialog extends JDialog
{
private String message = "HelloWorld";
private int count = 0;
private JTextField tfield;
private Timer timer;
private ActionListener timerAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (count == 10)
{
timer.stop();
ProgressExample.progressBar.setIndeterminate(false);
ProgressExample.progressBar.setValue(100);
ProgressExample.progressBar.setStringPainted(true);
dispose();
return;
}
tfield.setText(tfield.getText() + message.charAt(count));
count++;
}
};
public void createAndDisplayDialog()
{
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setLocationByPlatform(true);
JPanel panel = new JPanel();
tfield = new JTextField(10);
panel.add(tfield);
add(panel);
pack();
setVisible(true);
timer = new Timer(1000, timerAction);
timer.start();
}
}
所以,好像你写的是
ProgressExample.progressBar.setIndeterminate(false);
ProgressExample.progressBar.setValue(100);
ProgressExample.progressBar.setStringPainted(true);
在while
循环后。
答案 2 :(得分:1)
您可以查看my answer in a previous SO question,其中包含使用JProgressBar
的示例,该示例使用Thread
从其他SwingWorker
获取更新。是否使用SwingWorker
取决于您的使用案例。如果该函数需要一些时间来运行,则最好使用SwingWorker
以避免阻止UI。