2010-11-22 2 views
2

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

Thread1-> Основной 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 в цикле. Каждый раз, когда вызывается метод, ему присваивается новое значение скорости; но когда я запускаю программу, скорость перезаписывается на более ранней скорости. Я хочу очистить предыдущее значение скорости от пользовательского интерфейса, а затем написать новый.

ответ

0

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

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

+0

В последнее время я выяснил, как его достичь ...!но новая проблема, с которой я сталкиваюсь, заключается в том, что когда я обновляю скорость на SwingUI, числа переписываются друг на друга ...! Теперь у меня есть, чтобы очистить ранее написанный speed_integer от SwingUI и написать обновленный ... Как мне достичь этого ...? любая помощь будет оценена. – JaydeepW

+0

«постоянно обновлять эту рассчитанную скорость» означает? вы хотите добавить его? или какой-либо пример кода? –

+0

l1.setText (l1.getText(). ToString(), "\ n", скорость); –

0

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

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

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