簡體   English   中英

如何設置我的JProgressbar以顯示程序加載的進度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM