JProgressbar не отображается (без потоков)

у меня есть программа, которая занимает некоторое время, создавая файлы PDF, я хотел бы показать прогресс пользователю

когда я заканчиваю создание файла PDF, я пытаюсь вызвать индикатор выполнения, чтобы обновить его статус:

ProgressDialog progress = new ProgressDialog(instance, numberOfInvoices);
progress.setVisible(true);
progress.setAlwaysOnTop(true);

for(int i = 0 ; i<numOfPdfs ; i++){
    progress.change(i + 1);
}

диалог прогресса выглядит так:

public class ProgressDialog extends JDialog {

    private JProgressBar progressBar;

    public ProgressDialog(Window parent, int aantal) {
        super(parent);

        this.setPreferredSize(new Dimension(300, 150));

        progressBar = new JProgressBar(0, aantal);
        progressBar.setValue(0);
        progressBar.setSize(new Dimension(280, 130));
        this.add(progressBar, BorderLayout.CENTER);

        this.pack();
        this.setLocationRelativeTo(parent);
    }

    public void change(int aantal) {
        if (aantal < progressBar.getMaximum() && aantal >= 0) {
            progressBar.setValue(aantal);
        }
    }
}

все, что я получаю, это пустое окно (белое)

Я просмотрел этот форум, но решение с гусеницами кажется слишком сложным

между вычислением 2 файлов PDF я должен иметь возможность обновить графический интерфейс, верно?

хорошо, Колин

я пробовал это: (полный класс)

public class ProgressDialog extends JDialog {

    private JProgressBar progressBar;
    private String message;
    private static int number;

    public ProgressDialog(Window parent, int max, String message) {
    super(parent);

    this.message = message;
    this.setPreferredSize(new Dimension(300, 150));

    progressBar = new JProgressBar(0, max);
    progressBar.setValue(0);
    progressBar.setSize(new Dimension(280, 130));
    progressBar.setString(message + " 0/" + progressBar.getMaximum());
    progressBar.setStringPainted(true);
    this.add(progressBar, BorderLayout.CENTER);

    this.pack();
    this.setLocationRelativeTo(parent);

    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));


    }

    public void change(int number) {
    ProgressDialog.number = number;
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
        int number = ProgressDialog.getAantal();
        if (number < progressBar.getMaximum() && number >= 0) {
            progressBar.getModel().setValue(number);
            progressBar.setString(message + " " + progressBar.getValue() + "/" + progressBar.getMaximum());
            System.out.println("progressbar update: " + number + "/" + progressBar.getMaximum());
        } else {
            setCursor(null);
            System.out.println("progressbar terminated");
        }
        }
    });
    }

    public static int getAantal(){
    return number;
    }
}

теперь он по-прежнему показывает пустое окно, но когда все PDF-файлы готовы, он показывает индикатор выполнения с 0% завершением, а затем закрывается (как и должно быть)

есть идеи, почему он остается пустым во время процесса?


person Berty    schedule 06.07.2010    source источник


Ответы (2)


Вам нужно сделать это с потоками. Лучше изучить его, чем сбежать, потому что это общий дизайн фреймворка графического интерфейса.

Это может быть так же просто, как:

public void change(int aantal) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            if (aantal < progressBar.getMaximum() && aantal >= 0) {
                progressBar.setValue(aantal);
            }
        }
    });
}

Или замените invokeLater() на invokeAndWait().

person Konrad Garus    schedule 06.07.2010

Прочтите раздел руководства Swing по Параллелизм, чтобы понять, почему Для этой задачи нужны темы. Также прочитайте раздел «Как использовать индикаторы выполнения» для рабочего примера.

person camickr    schedule 06.07.2010