Хорошо, я работаю над своей последней дилеммой для моего проекта. Проект является средством обновления конечной точки 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 после того, как он установит флажок.
Итак, что я ищу, это:
- Как сделать так, чтобы пользователь мог устанавливать и снимать флажок по своему усмотрению (даже если это несколько раз подряд).
- Как сделать так, чтобы пользователь мог изменить значение в jTextField4, чтобы он автоматически отменял текущий таймер и запускал новый с новым значением (я ничего не делал с jTextField4 вообще, поэтому я Придется создать событие, чтобы осветить его позже).
Спасибо, и хорошего дня :)
Патрик.