好的,我正在为我的项目解决最后的困境。该项目是 TunnelBroker 的 IPv6 隧道的 IPv4 端点更新程序。我有一切工作,除了计时器。它可以工作,但是如果用户禁用“自动更新”并重新启用它,应用程序就会崩溃。我需要计时器位于 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 做任何事情,所以我将拥有创建一个事件以稍后覆盖它)。
谢谢,祝你有美好的一天:) 帕特里克。