Java 如何停止一个定时器不断重复的软件?

Java 如何停止一个定时器不断重复的软件?,java,timer,Java,Timer,我已经创建了一个软件计时器,当它归零时,它将启动一个新的登录屏幕。问题是登录会反复出现。如何阻止这一切 class DisplayCountdown extends TimerTask { int seconds = 0005; public void run() { if (seconds > 0) { int hr = (int) (seconds / 3600); int rem = (int) (s

我已经创建了一个软件计时器,当它归零时,它将启动一个新的登录屏幕。问题是登录会反复出现。如何阻止这一切

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();
        }
    }
}
class DisplayCountdown扩展了TimerTask{
整数秒=0005;
公开募捐{
如果(秒>0){
int hr=(int)(秒/3600);
int rem=(int)(秒数%3600);
int mn=rem/60;
整数秒=雷姆%60;
字符串hrStr=(hr<10?:“)+hr;
字符串mnStr=(mn<10?:“)+mn;
字符串secStr=(秒<10?:“)+sec;
秒--;
lab.setText(hrStr+“:“+mnStr+”:“+secStr+”);
}否则{
login ty=新登录();
login.scname.setText(scname.getText());
login.scnum.setText(scnum.getText());
login.mar.setText(jTextField1.getText());
ty.setVisible(true);
处置();
}
}
}

不清楚代码是什么,但您不能使用TimerTask类的“cancel()”方法来取消它吗?

这违反了Swing的单线程规则-在事件调度线程的上下文之外更新UI

您应该使用
javax.swing.Timer
,而不是
TimerTask

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();
            //...
        }
    }
});

查看

您需要保留以前登录屏幕的参考,并在创建新屏幕之前对其进行处理