Как я могу настроить свой JProgressbar, чтобы показать прогресс загрузки моей программы - PullRequest
0 голосов
/ 15 февраля 2019

Когда моя программа запускается, мой JProgressBar запускается так, как я хочу, и показывает ход загрузки моей программы, но у меня есть функция перезапуска для базы данных, и я должен использовать dispose () для сброса всех компонентов и, таким образом,перезагрузка всех компонентов.

Процесс перезапуска точно такой же, как и при запуске, но в этом случае JProgressbar вообще не загружается (просто пустое окно), весь класс не хочет работать.

a через приведенный ниже код: оператор If проверяет, существует ли файл базы данных, оттуда он загружает класс индикатора выполнения и устанавливает максимальные параметры и значения i.Когда база данных и графический интерфейс загружаются, она увеличивает значение индикатора выполнения, а когда графический интерфейс завершает загрузку, она использует 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 в любое время во время выполнения программы и показыватьПользователь продвигается программой во время работы в фоновом режиме ... Причина в том, что по мере роста базы данных или после завершения импорта требуется время, и программа должна показать, что она работает над задачей, а не просто работает вхолостую..

1 Ответ

0 голосов
/ 15 февраля 2019

Вероятная причина:

В первый раз приведенный выше код вызывается из основного метода, поэтому он не вызывается из потока событий Swing и поэтому не блокирует этот поток, что позволяет ему выполнятьего работа, в том числе рисование JProgressBar и остальной части графического интерфейса.

Во второй раз, когда код вызывается, он, вероятно, вызывается из события Swing и, вероятно, не вызывается специально из SwingWorker или другого фонового потока, и поэтому на этот раз он вызывается в потоке события GUI ипоэтому блокирует этот поток, что означает, что индикатор выполнения не обновляется графически

Решение: узнайте и используйте SwingWorker для выполнения своей длительной фоновой работы, обновите свойство прогресса рабочего(разрешено переходить от 0 до 100), присоедините PropertyChangeListener к этому же рабочему списку для внесения изменений в прогресс и обновите JProgressBar из этого прослушивателя изменений свойств.

Прочитайте Параллельность в Swing, чтобы лучше понять работу потока событий Swing.

...