динамическое обновление текста метки в Java Swing - PullRequest
2 голосов
/ 22 ноября 2010

Я создаю простой менеджер загрузок в Java swing ...! Я использовал разные темы для разных задач в диспетчере загрузок.

Thread1-> main Thread2-> downloadSpeedTracker Thread3-> SwingUIRendrer

В этом приложении я вычисляю скорость загрузки, создавая поток в классе downloadSpeedTracker, и я пересчитываю эту скорость через каждую секунду. Я создал Thread3 в классе SwingUIRendrer. Теперь я хочу отправить эту рассчитанную скорость моему классу SwingUIRendrer.

Я хочу постоянно обновлять эту расчетную скорость на SwingUI. Как мне этого добиться ...?


@ Mohamed:

public void setUI(int speed)
{
    JLabel l1= new JLabel("Speed :"+speed);
    wind.add(l1); 
    wind.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    wind.setSize(200, 60);
}

Я вызываю метод SetUI в цикле while. Каждый раз, когда вызывается метод, ему отправляется новое значение скорости; но когда я запускаю программу, скорость перезаписывается на ранее показанную скорость. Я хочу очистить предыдущее значение скорости из пользовательского интерфейса, а затем записать новое.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2011

3-й поток не требуется, поскольку обновление пользовательского интерфейса должно выполняться в потоке диспетчеризации событий.

Одним из решений может быть:

  1. Определить интерфейс ISpeedListener, что-то вроде ниже:

    public interface ISpeedListener {  
      public void onSpeedChange(long newSpeed);  
    }  
    
  2. В DownloadSpeedTrackerсоздайте список (ArrayList) для хранения слушателей и добавьте методы, позволяющие добавлять / удалять скоростных слушателей.Когда скорость изменяется, уведомите слушателей, вызвав метод onSpeedChange.

    private List<ISpeedListener> listeners = new ArrayList<ISpeedListener>();
    
    public void addSpeedListener(ISpeedListener l) {
      listeners.add(s)
    }
    
    public void removeSpeedListener(ISpeedListener l) {
      listeners.remove(s)
    }
    
    // call this method when the speed changes
    private void notifyListeners(long newspeed) {
      foreach (ISpeedListener l : listeners) {
        l.onSpeedChange(newspeed);
      }
    }
    
  3. В классе SwingUIRendrer сделайте так, чтобы он реализовал класс ISpeedListener, в методе onSpeedChange обновите связанный пользовательский интерфейскомпонент, использующий SwingUtilites.invokeLater для выполнения операций над компонентом пользовательского интерфейса в потоке отправки событий.

    public class SwingUIRendrer implements ISpeedListener {
      public void onSpeedChange(final long newSpeed) {
    
        SwingUtilites.invokeLater(new Runnable() {
          public void run() {
            //TODO.... update the label with new speed.                
          }
        }
        );
      }
    }
    

Перед запуском DownloadSpeedTracker создайте экземпляр SwingUIRendrer и добавьте его в DownloadSpeedTracker какслушатель.

SwingUIRendrer render = new SwingUIRendrer(<other parameter>);
DownloadSpeedTracker tracker = new DownloadSpeedTracker();
tracker.addSpeedListener(render);
render.start();
0 голосов
/ 05 сентября 2012

Не обновление графического интерфейса является общеизвестной проблемой, в этом руководстве объясняется, как именно оно работает, с четкими ответами.

0 голосов
/ 22 ноября 2010

Сохранить рассчитанную скорость в классе, скажем, как «Скорость». Сделать этот класс общим, а чтение и запись этой общей переменной должны быть взаимоисключающими. Я имею в виду синхронизировать эту точку доступа к переменной.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...