2013-09-01 1 views
-1

У меня есть индикатор выполнения, когда я нажимаю кнопку, на слушателе кнопки у меня есть индикатор выполнения, который обновляется как что-то загружает. Однако графический интерфейс зависает до завершения загрузки. Как я могу заставить этот индикатор выполнения обновляться по мере продолжения загрузки? Однако, если загрузка начинается, когда приложение компилируется без вмешательства пользователя, загрузка прогрессирует по мере обновления строки выполнения. Тем не менее, это полная противоположность слушателю действий JButton.JButton Action Lister индикатор выполнения, обновление без замораживания?

Как я могу использовать SwingWorker, чтобы заставить это работать?

while((i=in.read(data,0,1024))>=0) 
        { 
        totalDataRead=totalDataRead+i; 
        bout.write(data,0,i); 
        float Percent=(totalDataRead*100)/filesize; 
        currentProgress.setValue((int)Percent); 

        float allP = Percent/5; 
        all.setValue((int)allP); 

        } 

Это только контур (без catchException), как я могу, возможно, получить графический интерфейс для обновления по мере загрузки, после кнопки слушателя ?!

ответ

3

Выполнение загрузки в другом потоке с использованием SwingWorker. Here у вас есть полный пример, который мне очень нравится с progressBar, см. setProgress()publish() и process(). Когда вы используете setProgress(), это свойство привязки, которое вы можете применить к шаблону наблюдателя, вы можете зарегистрировать слушателя, затем, когда этот метод называется, увольняется, и вы поймаете и можете обновить свой progressBar, а также отделить компоненты.

Пример:

public class MyWorker extends SwingWorker<Integer, String> { 

    @Override 
    protected Integer doInBackground() throws Exception { 
    // Start 
    publish("Start Download"); 
    setProgress(1); 

    // More work was done 
    publish("More work was done"); 
    setProgress(10); 

    // Complete 
    publish("Complete"); 
    setProgress(100); 
    return 1; 
    } 

    @Override 
    protected void process(List< String> chunks) { 
    // Messages received from the doInBackground() (when invoking the publish() method) 
    } 
} 

и в коде клиента:

SwingWorker worker = new MyWorker(); 
    worker.addPropertyChangeListener(new MyProgressListener()); 
    worker.execute(); 

    class MyProgressListener implements PropertyChangeListener { 
     @Override 
     public void propertyChange(final PropertyChangeEvent event) { 
     if(event.getPropertyName().equalsIgnoreCase("progress")) { 
      downloadProgressBar.setIndeterminate(false); 
      downloadProgressBar.setValue((Integer) event.getNewValue()); 
     }   
     } 
    } 
+0

Я до сих пор не имеют абсолютно никакого понятия о том, как сделать любой из этой SwingWorker, это смешно. –

+0

@JohnSmith Вы прочитали учебник? что ссылка в «ЗДЕСЬ» .. Опубликуйте то, что вы пробовали, и мы поможем вам – nachokk

+0

Я читал учебник, я был очень устал вчера. Я продолжу это снова сегодня, спасибо. –