JProgressbar не отображается (без потоков) - PullRequest
0 голосов
/ 06 июля 2010

У меня есть программа, которая занимает некоторое время для создания 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);
}

progressdialog выглядит так:

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% завершено затем закрывается (как и должно быть)

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

Ответы [ 2 ]

4 голосов
/ 06 июля 2010

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

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

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

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

0 голосов
/ 06 июля 2010

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

...