2010-07-06 2 views
0

У меня есть программа, которая занимает некоторое время создания PDF-файлов я хотел бы показать прогресс на пользовательJProgressBar не показывать (без резьбы)

, когда я закончу создание файла в формате 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 файлов я должен быть в состоянии обновить графический интерфейс, не так ли?

нормально Colin

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

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-готовы это действительно показать ProgressBar с 0% завершено затем он закрывается (как и следовало сделать)

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

ответ

4

Вам нужно сделать это с помощью ниток. Лучше узнайте об этом, чем побегите, потому что это общий дизайн рамки 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

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

Смежные вопросы