问题描述
我使用SwingWorker制作带有Java Swing API的进度条。
I use SwingWorker to make a progress bar with Java Swing APIs.
我有一个扩展SwingWorker的类
I have a class that extends SwingWorker
class Swinger extends SwingWorker {
private ClassAnalyzer classAnalyzer;
public Swinger(ClassAnalyzer classAnalyzer){
this.classAnalyzer = classAnalyzer;
}
@Override
public Void doInBackground() throws InterruptedException {
try
{
int progress = 0;
while (progress < 100) {
// at this point I make certain elaboration on classAnalyzer
progress++;
//Call the process method to update the GUI
publish(progress);
}
}
catch(InterruptedException e)
{
}
return null;
}
@Override
protected void process(List chunks) {
for (Integer chunk : chunks) {
progressBar.setValue(chunk);
//if the switchtype checkbox is selected then
//change the progressbar to a determined type
//once the progress has reached 50
if (chunk > 49)
{
if (switchType.isEnabled() && switchType.isSelected())
{
progressBar.setStringPainted(true);
}
}
}
}
}
和第二类(我正在写一部分)
and a second class (I'm writing a piece of this)
public Tester()
{
JFrame guiFrame = new JFrame();
//make sure the program exits when the frame closes
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Creating a Table Example");
guiFrame.setSize(700,200);
//This will center the JFrame in the middle of the screen
guiFrame.setLocationRelativeTo(null);
goButton = new JButton("Go");
goButton.setActionCommand("Go");
goButton.addActionListener(new ActionListener()
{
//When the button is clicked the SwingWorker class is executed and
//the button is disabled
@Override
public void actionPerformed(ActionEvent event)
{
progressBar.setStringPainted(progressType.isSelected());
ClassAnalyzer c = new ClassAnalyzer();
Swinger task = new Swinger(c);
task.execute();
int methods = c.getNumberOfMethods();
if(methods == 0){
JOptionPane.showMessageDialogo(null, "methods not found");
}
goButton.setEnabled(false);
}
});
}
当我在测试仪中启动第二课时,消息在进度条出现之前显示找不到方法,而我希望在
之后出现消息。怎么办?
When I launch in a Tester the second class, the message "methods not found" is displayed before progress bar appears, while I would like message appears in case after. What to do?
推荐答案
task.execute()
将启动一个background(将从中调用 doInBackground
方法),程序将继续执行。
task.execute()
will launch a background (in which the doInBackground
method will be called from) and the program will continue executing.
task.execute()
不是阻塞方法,这是使用它的原因,所以你不要阻止事件调度线程
task.execute()
is not a blocking method, this is the reason for using it, so you don't block the Event Dispatching Thread
您可以使用 PropertyChangeListener
final ClassAnalyzer c = new ClassAnalyzer();
Swinger task = new Swinger(c);
task.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
int methods = c.getNumberOfMethods();
if(methods == 0){
JOptionPane.showMessageDialogo(null, "methods not found");
}
}
}
});
task.execute();
这篇关于使用SwingWorker在GUI中添加进度条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!