[英]How can I set up my JProgressbar to show the progress of my program loading
當我的程序啟動時,我的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,並讓其向用戶顯示程序在后台工作時正在取得的進展...原因是,隨着數據庫的增長或何時導入已完成,這需要時間,並且程序必須顯示它正在執行任務,而不僅僅是閑着。
可能的原因:
第一次,上面的代碼是從main方法調用的,因此不會從Swing事件線程調用,因此不會阻塞該線程,從而允許它執行其工作,包括繪制JProgressBar和GUI的其余部分。
第二次調用該代碼時,很可能是通過Swing事件調用的,而可能不是從SwingWorker或其他后台線程中專門調用的,因此這次是在GUI事件線程上調用的,因此確實會阻塞該線程,表示進度條不會以圖形方式更新
解決方案:了解並使用SwingWorker進行長時間的后台工作,更新worker的progress屬性(允許從0到100),將PropertyChangeListener附加到同一worker列表以進行進度更改,並更新您的此屬性內的JProgressBar更改偵聽器。
請閱讀Swing中的並發性,以更好地了解Swing事件線程的工作原理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.