0

好的,我正在为我的项目解决最后的困境。该项目是 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 中的值。

所以,我正在寻找的是这个:

  1. 如何做到这一点,以便用户可以根据需要选择和取消选择复选框(即使它连续多次)。
  2. 如何做到这一点,以便用户可以更改 jTextField4 中的值,并让它自动取消当前计时器,并使用新值启动一个新计时器(我根本没有对 jTextField4 做任何事情,所以我将拥有创建一个事件以稍后覆盖它)。

谢谢,祝你有美好的一天:) 帕特里克。

4

1 回答 1

1

也许这项任务更适合javax.swing.Timer. 有关详细信息,请参阅Timer.restart()

请注意,这Timer在长时间内相对不准确。解决这个问题的一种方法是让它经常重复,但在达到或超过某个时间时只执行分配的任务。


我是否能够将所有内容包装在对 Swing Timer 的调用的“任务”部分中,还是必须创建另一个处理该任务的类?

您可能希望将 grunt 工作包装在 aSwingWorker中以确保 EDT 不被阻塞。

..我假设我必须将计时器创建为类级声明..对吗?

是的,我就是这么想的。

于 2011-05-01T06:06:52.517 回答