2012-05-14 3 views
1

Мне нужно обновить jProgressBar в методе, который читается из файла и выполняет некоторые операции. Я пытался обновить прогресс бар с помощью этого метода:Каковы способы обновления jProgressBar?

public void progressUpdate(int percent) { 
    System.out.println("Update = "+percent); 
    synchronized (jMainProgressBar) { 
     jMainProgressBar.setValue(percent); 
    } 
    SwingUtilities.invokeLater(
     new Runnable() { 

      public void run() { 
      jMainProgressBar.updateUI(); 
      jMainProgressBar.repaint(); 
      } 
     }); 
} 

как всегда это работает только тогда, когда метод выполняется. Но если я постоянно обновляю этот метод, ничего не происходит.

Возможно, некоторые знают, как улучшить этот метод?

Это также было бы неплохо для большего предложения Worker thread и еще.

+0

Для лучшей помощи раньше, опубликовать [SSCCE] (http://sscce.org/). –

+0

@Streetboy method 'updateUI();' предназначен для изменения методов Look and Feel, вы? – mKorbel

ответ

3

Вы, вероятно, хотите сделать

public void progressUpdate(final int percent) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      jMainProgressBar.setValue(percent); 
     } 
    }); 
} 
+1

+1 да - никогда не получить доступ к компоненту Swing из нитки. –

+0

Да. Это в значительной степени подводит итог :-) – aioobe

+0

Все еще это не трюк. Потому что в моем методе он не обновляет прогресс. Он обновляется только тогда, когда он заканчивается – Streetboy

2

Не используйте тему. Используйте таймер. См следующее: (! Но не от вопроса)

+0

Если вы снимете ссылку RoseIndia, поднимите нижнюю ссылку вверху и добавьте контекст к ссылкам, я мог бы проголосовать за это. О, черт возьми, +1 в любом случае. –

+0

Спасибо Andrew :) Но, в чем дело с соединением roseindia? –

+1

Роуз Индии. Что бы это ни было неправильно, либо устарело, либо плохо отформатировано и выражено. По правде говоря, я даже не следую этим ссылкам, чтобы удовлетворить мое (минимальное) любопытство относительно того, какие проблемы относятся к какой-либо конкретной странице. Но тогда, если OP не сможет понять это из 2 ссылок Oracle и опубликовать SSCCE, они будут потеряны в любом случае. (пожимает плечами) –

1

На основе комментариев вы наделили вас выполняют тяжелую работу по теме Dispatch Thread (EDT). Это блокирует поток и избегает любых запланированных рецензий. Вот почему вы видите только обновление своего JProgressBar после завершения работы, так как это тот момент, когда EDT становится доступным для выполнения перерисовки.

Решение уже предусмотрено в ссылках, размещенных на других, но это в основном сводится к:

  • выполнять работу на рабочем потоке
  • обновление прогресс в JProgressBar на EDT

Два наиболее распространенных способа достижения этого - использование SwingWorker или использование SwingUtilities.invokeLater от рабочего потока.

Всех соответствующих ссылок можно найти в ответе Йоан Weerasinghe

0

Проверьте это

Timer barTimer; 
barTimer=new Timer(100,new ActionListener() 
    { 
    public void actionPerformed(ActionEvent e) 
     { 
     barvalue++; 
     if(barvalue>jProgressBar1.getMaximum()) 
      { 
       /* 
       * To stop progress bar when it reaches 100 just write barTime.stop() 
       */ 
       barTimer.stop(); 
       barvalue=0; 

    } 
    else 
    { 
     int a=(int)jProgressBar1.getPercentComplete(); 
     jProgressBar1.setStringPainted(true); 
     jProgressBar1.setValue(barvalue); 

     } 
    } 
    }); 
    barTimer.start(); 

Проверьте код по этой ссылке http://java23s.blogspot.in/2015/10/how-to-implement-progress-bar-in-java.html