一个简单的计时器:
public class Testtime extends JFrame implements ActionListener,Runnable{
JButton btn1;
JButton btn2;
JLabel time;
int minute,seconds;
Thread begin;
boolean flag;
public Testtime(){
btn1=new JButton("开始计时 ");
btn2=new JButton(" 停止计时");
time=new JLabel(0+":"+0);
minute=0;seconds=0;
add(btn1);
add(time);
add(btn2);
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
btn1.addActionListener(this);
btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn1){
begin=new Thread(Testtime.this);
minute=0;seconds=0;
flag=true;
begin.start();
}
else{
flag=false;
}
}
public void run(){
while(flag){
seconds++;
if(seconds%60==0){
seconds=0;
minute++;
}
time.setText(minute+" : "+seconds);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
new Testtime();
}
}
点击按钮“开始计时”,“停止计时”均能正常工作。但是如果我连续点击了两次“开始计时”,秒钟速度会快一倍。
请问该怎么修改代码呢?
public class Testtime extends JFrame implements ActionListener,Runnable{
JButton btn1;
JButton btn2;
JLabel time;
int minute,seconds;
Thread begin;
boolean flag;
public Testtime(){
btn1=new JButton("开始计时 ");
btn2=new JButton(" 停止计时");
time=new JLabel(0+":"+0);
minute=0;seconds=0;
add(btn1);
add(time);
add(btn2);
setLayout(new FlowLayout());
setSize(400,400);
setVisible(true);
btn1.addActionListener(this);
btn2.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn1){
begin=new Thread(Testtime.this);
minute=0;seconds=0;
flag=true;
begin.start();
}
else{
flag=false;
}
}
public void run(){
while(flag){
seconds++;
if(seconds%60==0){
seconds=0;
minute++;
}
time.setText(minute+" : "+seconds);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
new Testtime();
}
}
点击按钮“开始计时”,“停止计时”均能正常工作。但是如果我连续点击了两次“开始计时”,秒钟速度会快一倍。
请问该怎么修改代码呢?
解决方案 »
- 各位过来人给个意见,SE部分看完了,是巩固呢,还是继续EE部分,回头再巩固SE?
- 空对象
- 学习java的rmi用什么书好一点啊?
- 关于java imageobser 的 imageupdate()类的问题
- 一个正则表达式问题????
- 初学者关于孙鑫老师视频中一段代码的疑问(不好意思,有可能是刚才没说明白)
- 如何把"\\"换成"\"
- 学习J2EE方面知识?需要学习SWING,APPLET这些吗?
- 如何在方法内部对外部数据进行操作,不用返回值:而外部数据已经被修改。
- java多线程问题,请教大神,多谢
- JDK是否可以和Visual Studio共存?
- NetBeans用起太郁闷了,还是Eclipse好用。
把这行代码放在方法外面去,因为你点一次就创建了一个线程,当然你的速度会变快,因为已经有两个线程在及时了,放在外面就应该没问题了
如下修改代码: public void actionPerformed(ActionEvent e) {
if(e.getSource()==btn1){
if (begin != null && begin.isAlive()) { //检查线程的状态
begin.stop();
}
begin = new Thread(Testtime.this);
minute=0;seconds=0;
flag=true;
begin.start();
}
else{
flag=false;
}
}