Обновление индикатора выполнения

У меня есть большая программа, которую нужно вызывать с помощью графического интерфейса. В графическом интерфейсе есть индикатор выполнения, который необходимо обновить (например, 5% .... 10%) после того, как пользователь нажмет кнопку запуска. Проблема в том, что выполняемая фоновая задача не имеет фиксированного времени выполнения. Таким образом, каким-то образом можно измерить ход выполнения задачи в методе doInBackground() (я пытаюсь использовать SwingWorker). Или я должен идти с неопределенным индикатором выполнения. Я не смог четко понять пример, представленный на странице учебника Oracle, и не смог найти достойную страницу, объясняющую, как использовать индикатор выполнения. Любая помощь будет высоко оценена.


person Sashank    schedule 06.03.2014    source источник
comment
stackoverflow.com/questions/277007/how-to-use-jprogressbar действительно похоже на ваш вопрос.   -  person MemLeak    schedule 06.03.2014
comment
@MemLeak ввод в мою программу не имеет фиксированного размера, и, соответственно, время выполнения варьируется. Программа использует генетический алгоритм и реализуется с помощью потока.   -  person Sashank    schedule 06.03.2014
comment
извини @ user3313050 я не могу этого сделать. Но можете ли вы объяснить, как метод public void propertyChange(PropertyChangeEvent evt) работает в данном ссылка   -  person Sashank    schedule 06.03.2014


Ответы (1)


Согласно задаче, я бы использовал бесконечный индикатор выполнения

public class Indeterminate extends JProgressBar {

    private static final long serialVersionUID = -281761375041347893L;

    /***
     * initial the ProgressBar 
     */
    public IndeterminateProgressBar() {
        super();
        setIndeterminate(true);
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                setVisible(false);
            }
        });
    }

    /**
     * call this, if you start a long action
     */
    public void start() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                setVisible(true);
            }
        });
    }

    /**
     * if you have finished, call this
     */
    public void end() {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                setVisible(false);
            }
        });
    }

}

Используется следующим образом:

ActionListener startButtonListener = new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {

        new Thread(new Runnable() {

            @Override
            public void run() {

                try {
                    progressBar.start();
                    // long operation

                } catch (Exception e) {
                    // handle excpetion
                } finally {
                    progressBar.end();

                }

            }
        }).start();

    }
};
person MemLeak    schedule 06.03.2014
comment
Спасибо за ответ, я попробую это. - person Sashank; 06.03.2014