2015-08-07 2 views
0

Я использую таймер качания для загрузки различных файлов PDF в swing-приложении , но перед тем как столкнуться с проблемой, когда я выполняю программу, экран остается пустым в течение нескольких секунд, например, 4 5 секунд, а затем файл pdf отображается так, что за это время я хочу показать сообщение, например, подождите. Вот мой пример кодаЯ хочу выполнить некоторую задачу в фоновом режиме в swing

  if (type[i].equalsIgnoreCase("PDF")) { 
      int k = i; 
      pdfTimer = new Timer(0, (ActionEvent e) -> { 
       renderPDF(k); 

      }); 
      pdfTimer.setDelay(1000*2); 
      pdfTimer.start(); 
+0

Используйте «SwingWorker». Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

ответ

0

Вы можете отобразить индикатор выполнения и вычислить рендеринг на втором потоке.

JLabel lblWait = new JLabel("Please wait..."); 
    lblWait .setBounds(116, 26, 113, 14); 
    contentPanel.add(lblWait); 

    final JProgressBar progressBar = new JProgressBar(); 
    progressBar.setStringPainted(true); 
    progressBar.setBounds(72, 66, 187, 16); 
    contentPanel.add(progressBar); 
    { 
     JPanel buttonPane = new JPanel(); 
     buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
     getContentPane().add(buttonPane, BorderLayout.SOUTH); 
     { 
      final JButton btFin = new JButton("Cancel"); 
      btFin.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent arg0) { 
        dispose(); 
       } 
      }); 

      buttonPane.add(btFin); 
     } 
    } 
    Thread t = new Thread() { 
      public void run() { 
       //You launch the thread with your progress bar as an argument 
       maStructure.setaAfficher(new MgtSimulation(aAfficher, nombreSimulations).jouerSimulations(progressBar)); 
       maStructure.actualiserAffichage(); 
       dispose(); 
      } 
      }; 
      t.start(); 
} 

И вы измените значение прогресса бар в вашем методе

public BeanAffichage jouerSimulations(JProgressBar progressBar){ 
    //Variables 

    for (int i = 0; i < nombreSimulations; i++) {   
     //Computing 

     progressBar.setValue(Whatever you want); 
    } 



    return aAfficher; 
} 
+1

Это ужасная идея. Просто говорю. –

+0

Я всегда так делаю. Почему это ужасная идея? –

+1

Потому что качели не являются потокобезопасными. И в вашем примере вы обновляете свои компоненты из некоторого внешнего потока. Как вы думаете, почему SwingWorker существует ... –

2

Запуск визуализации на SwingWorker's фоновом потоке методом (doInBackground). Таким образом, ваш графический интерфейс будет оставаться отзывчивым. Из метода done вы можете уведомить пользователя о том, что рендеринг сделан. Имейте в виду не обновлять Swing GUI от doInBackground, так как он работает за пределами EDT.

P.S. Таймер Swing предназначен для повторяющихся задач.

+0

Я также хочу сделать повторяющуюся задачу для рендеринга каждой страницы pdf и только в первый раз экран остается пустым –

0

Просто альтернатива дляSwingWorker

По умолчанию показывают некоторые сообщения как Загрузка ... и создать Thread работать в фоновом режиме, который загружает PDF и обновляет окно

class BackgroundThread implements Runnable { 

    @Override 
    public void run() { 

     // the Swing call below must be queued onto the Swing event thread 
     SwingUtilities.invokeLater(new Runnable(){ 
     @Override 
     public void run() { 
      // OK To make Swing method calls here 
      loadFile(args..); 
      repaint();//Or something similar that fits your purpose 
     } 
     }); 
    } 
} 
Смежные вопросы