0

ソフトウェアタイマーを作成しました。タイマーがゼロになると、新しいログイン画面が開始されます。問題は、ログインが何度も繰り返されることです。これを止める方法は?

class DisplayCountdown extends TimerTask {

    int seconds = 0005;

    public void run() {
        if (seconds > 0) {
            int hr = (int) (seconds / 3600);
            int rem = (int) (seconds % 3600);
            int mn = rem / 60;
            int sec = rem % 60;
            String hrStr = (hr < 10 ? "0" : "") + hr;
            String mnStr = (mn < 10 ? "0" : "") + mn;
            String secStr = (sec < 10 ? "0" : "") + sec;
            seconds--;
            lab.setText(hrStr + " : " + mnStr + " : " + secStr + "");
        } else {
            login ty = new login();
            login.scname.setText(scname.getText());
            login.scnum.setText(scnum.getText());
            login.mar.setText(jTextField1.getText());
            ty.setVisible(true);
            dispose();
        }
    }
}
4

3 に答える 3

1

これは、Swing のシングル スレッド ルールに違反しています - イベント ディスパッチ スレッドのコンテキスト外で UI を更新します。

の代わりにTimerTask、を使用する必要がありますjavax.swing.Timer

javax.swing.Timer swingTimer = new javax.swing.Timer(500, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        if (seconds > 0) {
            //...
        } else {
            ((javax.swing.Timer)evt.getSource()).stop();
            //...
        }
    }
});

Swingの同時実行性を見てみましょう

于 2013-10-07T05:53:08.717 に答える
0

何のコードかは不明ですが、TimerTask クラスの「cancel()」メソッドでキャンセルできないのでしょうか?

于 2013-10-07T05:50:59.207 に答える