在我的项目中,我有一个中央数据库类。每次访问数据库时,我都想显示一个不确定的进度条。到目前为止,我设法建立了所有机制,让数据库在打开和关闭连接时触发事件。您可以找到详细信息here。
据我所知,SwingWorker需要让Swing代码像进度条的动画一样运行而其他代码在后台执行。我还读到你在doInBackground()
方法中启动长时间运行的进程,这在我的情况下是没有必要的,因为数据库访问的长时间运行过程已经开始了。
我无法让SwingWorker部分解决方案正常工作。动画在连接已关闭时启动,并且每次访问数据库时都会打开一个新的框架:
以下是代码:
public class UI_DbProgressbar implements Db_ActionListener{
public void DbActionReceived(final Db_ActionEvent event) {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new FlowLayout());
frame.setLocationRelativeTo(null);
final JProgressBar jProgressBar = new JProgressBar();
final JLabel status = new JLabel("Connecting...");
frame.add(status);
frame.add("jProgressBar", jProgressBar);
frame.pack();
if(event.Status() == Db_Status.CONNECTED)
{
System.out.println("DB is connected!");
frame.setVisible(true);
SwingWorker sw = new SwingWorker()
{
@Override
protected Object doInBackground() throws Exception
{
jProgressBar.setIndeterminate(true);
System.out.println("In progress!");
while(event.Status() != Db_Status.CLOSED);
return null;
}
@Override
public void done()
{
jProgressBar.setIndeterminate(false);
status.setText("Successful");
jProgressBar.setValue(100); // 100%
}
};
sw.execute();
}
else if(event.Status() == Db_Status.CLOSED)
{
System.out.println("DB connection is closed!");
frame.dispose();
}
else
{
System.out.println("DB idle!" );
}
}
}
我需要SwingWorker才能获得动画进度条 - 是否真的有必要使用SwingWorker完成此任务?我的错是什么?