Каков наилучший способ реализовать таймер, который будет остановлен и перезапущен в приложении Java Swing? - PullRequest
0 голосов
/ 01 мая 2011

Хорошо, я работаю над своей последней дилеммой для моего проекта. Проект является средством обновления конечной точки IPv4 для туннеля IPv6 TunnelBroker. У меня все работает, кроме таймера. Это работает, однако, если пользователь отключает «автоматическое обновление» и включает его снова, приложение вылетает. Мне нужно, чтобы таймер находился в потоке за пределами EDT (таким образом, чтобы он мог быть уничтожен и создан заново, когда пользователь снимает флажок / проверяет функцию автоматического обновления или изменяет время между обновлениями).

Здесь я вставил код для флажка, который обрабатывает автоматические обновления, и класс таймера. Надеюсь, этого будет достаточно, чтобы получить ответ о том, как это сделать (я думаю, что это должен быть либо рабочий, либо использовать многопоточность - даже если будет активен только один таймер).

 private void jCheckBox1ItemStateChanged(java.awt.event.ItemEvent evt) {                                            
    // TODO add your handling code here:
    // if selected, then run timer for auto update
    // set time textbox to setEditable(true) and get the time from it.
    // else cancel timer.  Try doing this on different
    // class to prevent errors from happening on reselect.
    int updateAutoTime = 0;


    if (jCheckBox1.isSelected())
    {
        updateAutoTime = Integer.parseInt(jTextField4.getText())*60*1000;
        if (updateAutoTime < 3600000)
        {
            updateAutoTime = 3600000;
            jTextField4.setText(new Integer(updateAutoTime/60/1000).toString());
        }
        updateTimer.scheduleAtFixedRate(new TimerTask() {
    public void run()
    {
        // Task here ...
        if (jRadioButton1.isSelected())
        {
            newIPAddress = GetIP.getIPAddress();
        }
        else
        {
            newIPAddress = jTextField3.getText();
        }
         strUsername = jTextField1.getText();
         jPasswordField1.selectAll();
         strPassword = jPasswordField1.getSelectedText().toString();
         strTunnelID = jTextField2.getText();
         strIPAddress = newIPAddress;
         if (!newIPAddress.equals(oldIPAddress))
         {
             //fire the tunnelbroker updater class
             updateIP.setIPAddress(strUsername, strPassword, strTunnelID, strIPAddress);
             oldIPAddress = newIPAddress;
             jLabel8.setText(newIPAddress);
             serverStatus = updateIP.getStatus().toString();
             jLabel6.setText(serverStatus);
         }
         else
         {
             serverStatus = "No IP Update was needed.";
             jLabel6.setText(serverStatus);
         }
        }
}, 0, updateAutoTime);

    }
    else
    {
       updateTimer.cancel();
       System.out.println("Timer cancelled");
       System.out.println("Purged {updateTimer.purge()} tasks.");
    }


}     

Как я уже говорил, это работает один раз. Но если пользователь снимает флажок, он не будет работать снова. И пользователь не может изменить значение в jTextField4 после того, как он установит флажок.

Итак, что я ищу, это:

  1. Как сделать так, чтобы пользователь мог устанавливать и снимать флажок по своему усмотрению (даже если это несколько раз подряд).
  2. Как сделать так, чтобы пользователь мог изменить значение в jTextField4, чтобы он автоматически отменял текущий таймер и запускал новый с новым значением (я ничего не делал с jTextField4 вообще, поэтому я Придется создать событие, чтобы осветить его позже).

Спасибо, и хорошего дня :) Патрик.

1 Ответ

1 голос
/ 01 мая 2011

Возможно, эта задача лучше подойдет для javax.swing.Timer.Подробнее см. Timer.restart () .

Обратите внимание, что Timer является относительно неточным в течение длительных периодов времени.Один из способов объяснить это - часто повторять его, но выполнять назначенное ему задание только один раз за определенное время.


Смогу ли я обернуть все в "задача "часть вызова Swing Timer, или мне нужно создать другой класс, который обрабатывает задачу?

Возможно, вы захотите обернуть эту работу в SwingWorker, чтобы убедиться, что EDT не заблокирован.

.. Я предполагаю, что мне придетсясоздать таймер как объявление уровня класса .. правильно?

Да, именно об этом я и думал.

...