当我的程序启动时,我的JProgressBar会按照我想要的方式运行,并显示我的程序加载进度,但是我具有数据库的重启功能,因此必须使用dispose()来重置所有组件,因此重新加载所有组件。
重新启动过程与启动过程完全相同,但是在这种情况下,JProgressbar根本不加载(只是一个空白窗口),整个类都不希望工作。
运行以下代码:If语句测试数据库文件是否存在,从那里加载进度条类并设置i的max参数和值。在数据库和GUI加载时,它会增加进度栏的值,并且在GUI完成加载时,它使用dispose()关闭JProgressBar使用的窗口。继续,如果不存在,它将使用新的JProgressBar重新启动它。
我所知道的是,当它第一次加载进度条时,它将起作用。但是,当我第二次需要它时,它会失败。即使我重新设置了值,它仍然不起作用。
GUIBackEnd()
{
if(ec.hasDatabase())
{
pbc = new ProgressBarController(23, "Initializing E.M.M.A.", true);
pbc.setProgressText("Start-up");
update();
pbc.increaseBar();
pbc.setProgressText("Loading Equipment");
equipmentData = ec.viewEquipment();
pbc.increaseBar();
pbc.setProgressText("Loading Customers");
customerData = cc.viewCustomer();
pbc.increaseBar();
pbc.setProgressText("Loading Services");
serviceData = mc.viewService();
pbc.increaseBar();
pbc.setProgressText("Loading GUI");
frameGen();
pbc.dispose();
}
else
{
JOptionPane.showMessageDialog(null, "Main database was not found. \nE.M.M.A. will attempt to load the backup...", "WARNING",
JOptionPane.WARNING_MESSAGE);
String feed = ec.loadMainBackup();
JOptionPane.showMessageDialog(null, feed, "Loading",
JOptionPane.INFORMATION_MESSAGE);
if(!EquipmentController.hasLoaded)
{
JOptionPane.showMessageDialog(null, EquipmentController.mainLoaded, "RESTART", JOptionPane.PLAIN_MESSAGE);
restartGUI(true);
}
else
{
pbc = new ProgressBarController(23, "Initializing E.M.M.A.", true);
pbc.setProgressText("Start-up");
update();
pbc.increaseBar();
pbc.setProgressText("Loading Equipment");
equipmentData = ec.viewEquipment();
pbc.increaseBar();
pbc.setProgressText("Loading Customers");
customerData = cc.viewCustomer();
pbc.increaseBar();
pbc.setProgressText("Loading Services");
serviceData = mc.viewService();
pbc.increaseBar();
pbc.setProgressText("Loading GUI");
frameGen();
pbc.dispose();
}
}
}
我需要做的是,我应该能够在程序执行过程中随时调用JProgressBar,并让它向用户显示程序在后台工作时正在取得的进度...原因是,作为数据库增长或完成导入后,这需要时间,并且程序必须显示它正在执行任务,而不仅仅是在此处闲逛。
答案 0 :(得分:1)
可能的原因:
第一次,上面的代码是从main方法调用的,因此不会从Swing事件线程调用,因此不会阻塞该线程,从而允许它执行其工作,包括绘制JProgressBar和其余的代码GUI。
第二次调用该代码可能是从Swing事件调用的,并且可能不是在SwingWorker或其他后台线程中专门调用的,因此这次是在GUI事件线程上调用的,因此不会阻止此线程,这意味着进度条不会以图形方式更新
解决方案:了解并使用SwingWorker进行长期运行的后台工作,更新worker的progress属性(允许从0到100),将PropertyChangeListener附加到该同一worker列表中以进行进度更改,并从此属性更改侦听器中更新您的JProgressBar。
请阅读Concurrency in Swing,以更好地了解Swing事件线程的工作原理。