0

わかりました、私は自分のプロジェクトの最後のジレンマに取り組んでいます。このプロジェクトは、TunnelBroker の IPv6 トンネル用の IPv4 エンドポイント アップデーターです。タイマーを除いて、すべてが機能しています。これは機能しますが、ユーザーが「自動更新」を無効にして再度有効にすると、アプリケーションがクラッシュします。EDT の外部のスレッドにタイマーを配置する必要があります (ユーザーが自動更新機能のチェックを外したりチェックしたり、更新間の時間を変更したりしたときにタイマーを破棄して再作成できるようにするため)。

ここに貼り付けているのは、自動更新を処理するチェックボックスとタイマー クラスのコードです。うまくいけば、これがこれを行う方法についての答えを得るのに十分であることを願っています(アクティブなタイマーは1つだけですが、ワーカーである必要があるか、マルチスレッドを使用する必要があると思います)。

 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長期間にわたって比較的不正確であることに注意してください。これを説明する 1 つの方法は、頻繁に繰り返すが、割り当てられたタスクを実行するのは、特定の時間に達したか経過した 1 回だけにすることです。


Swing Timer の呼び出しの「タスク」部分にすべてをラップすることはできますか?それとも、タスクを処理する別のクラスを作成する必要がありますか?

SwingWorkerEDT がブロックされないように、単調な作業を a でラップすることをお勧めします。

..クラスレベルの宣言としてタイマーを作成する必要があると思います..正しいですか?

はい、それは私が考えていたことです。

于 2011-05-01T06:06:52.517 に答える