わかりました、私は自分のプロジェクトの最後のジレンマに取り組んでいます。このプロジェクトは、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 の値を変更できません。
だから、私が探しているのはこれです:
- ユーザーが必要に応じてチェックボックスを選択および選択解除できるようにする方法 (連続して複数回であっても)。
- ユーザーがjTextField4の値を変更し、現在のタイマーを自動的にキャンセルして、新しい値で新しいタイマーを開始できるようにする方法(jTextField4で何もしていないので、後でカバーするイベントを作成します)。
ありがとう、そして素晴らしい一日を:) パトリック。