小妹请教高手:自己编了一个倒计时器,但只能运行一次,为什么,如何修改?
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Countdown implements ActionListener,SwingConstants{
private int time;
Timer t = new Timer(1000,this);
JTextField jtfc = new JTextField(10);
JTextField[] jtf = new JTextField[3];

{for(int i=0;i<jtf.length;i++){
jtf[i] = new JTextField(3);
}}

public void actionPerformed(ActionEvent ae){
String comm = ae.getActionCommand();
int h = Integer.parseInt(jtf[0].getText());
int f = Integer.parseInt(jtf[1].getText());
int m = Integer.parseInt(jtf[2].getText());
 time = h*3600+f*60+m;
  if("start".equals(comm)){
    t.start();
    }else if("stop".equals(comm)){
    t.stop();
    }else{
    time--;
     }
    jtfc.setText(time/3600+"小时"+time%3600/60+"分钟"+time%60+"秒");
    if(time==0){
    System.exit(1);
     }

}

public Countdown(){
JFrame jf = new JFrame("DouSunny倒计时器");
jf.setLayout(new GridLayout(3,1));
JPanel jp1 = new JPanel(new FlowLayout());
String[] sl = {"设定时间:","小时","分","秒","距结束还有:"};
JLabel[] lb = new JLabel[sl.length];
for(int i=0;i<sl.length;i++){
lb[i] = new JLabel(sl[i]);
}

for(int i=0;i<3;i++){
jp1.add(lb[i]);
jp1.add(jtf[i]);
}
jp1.add(lb[3]);
jf.add(jp1);
JLabel jl = new JLabel();
//----------------------------
JButton jb = new JButton("start");
jb.addActionListener(this);
JPanel jp2 = new JPanel();
jp2.add(jb);
jf.add(jp2);
//-----------------------------
JPanel jp3 = new JPanel();
jp3.add(lb[4]);

jp3.add(jtfc);
jf.add(jp3);

jf.setSize(300,200);//大小
jf.setLocation(300,200);//出现位置
jf.setVisible(true);//可见
jf.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);

}
public static void main(String[] args) {
new Countdown();

}}

解决方案 »

  1.   

    我没看到你的定时器啊?你的显示时间的代码本来就只运行一次
    每次点击,就重置时间,然后秒数减1,然后退出了还有你的Timer用错了。你看看我的这个代码吧!import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;public class Countdown extends TimerTask implements ActionListener, SwingConstants {
      private int time;  Timer t = new Timer();  JTextField jtfc = new JTextField(10);  JTextField[] jtf = new JTextField[3];
      {
        for (int i = 0; i < jtf.length; i++) {
          jtf[i] = new JTextField(3);
        }
      }  public void actionPerformed(ActionEvent ae) {
        int h = Integer.parseInt(jtf[0].getText());
        int f = Integer.parseInt(jtf[1].getText());
        int m = Integer.parseInt(jtf[2].getText());
        time = h * 3600 + f * 60 + m;
        this.cancel();
        t.schedule(this, 0, 1000);
      }  @Override
      public void run() {
        jtfc.setText(time / 3600 + "小时" + time % 3600 / 60 + "分钟" + time % 60 + "秒");
        time--;
        if (time <= 0) {
          this.cancel();
        }
      }  public Countdown() {
        JFrame jf = new JFrame("DouSunny倒计时器");
        jf.setLayout(new GridLayout(3, 1));
        JPanel jp1 = new JPanel(new FlowLayout());
        String[] sl = { "设定时间:", "小时", "分", "秒", "距结束还有:" };
        JLabel[] lb = new JLabel[sl.length];
        for (int i = 0; i < sl.length; i++) {
          lb[i] = new JLabel(sl[i]);
        }
        for (int i = 0; i < 3; i++) {
          jp1.add(lb[i]);
          jp1.add(jtf[i]);
        }
        jp1.add(lb[3]);
        jf.add(jp1);
        JLabel jl = new JLabel();
        // ----------------------------
        JButton jb = new JButton("start");
        jb.addActionListener(this);
        JPanel jp2 = new JPanel();
        jp2.add(jb);
        jf.add(jp2);
        // -----------------------------
        JPanel jp3 = new JPanel();
        jp3.add(lb[4]);
        jp3.add(jtfc);
        jf.add(jp3);
        jf.setSize(300, 200);// 大小
        jf.setLocation(300, 200);// 出现位置
        jf.setVisible(true);// 可见
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }  public static void main(String[] args) {
        new Countdown();
      }
    }
      

  2.   

    [Java Code]import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingConstants;public class Countdown extends TimerTask implements ActionListener,
    SwingConstants {
    private int time; Timer t = new Timer(); JTextField jtfc = new JTextField(10); JTextField[] jtf = new JTextField[3];
    {
    for (int i = 0; i < jtf.length; i++) {
    jtf[i] = new JTextField(3);
    }
    } public void actionPerformed(ActionEvent ae) {
    int h = Integer.parseInt(jtf[0].getText());
    int f = Integer.parseInt(jtf[1].getText());
    int m = Integer.parseInt(jtf[2].getText());
    time = h * 3600 + f * 60 + m;
    try {
    t.schedule(this, 0, 1000);
    }
    catch(Exception e){

    } } @Override
    public void run() {
    jtfc.setText(time / 3600 + "小时" + time % 3600 / 60 + "分钟" + time % 60
    + "秒");
    time--;
    if (time <= 0) {
    this.cancel();
    }
    } public Countdown() {
    JFrame jf = new JFrame("DouSunny倒计时器");
    jf.setLayout(new GridLayout(3, 1));
    JPanel jp1 = new JPanel(new FlowLayout());
    String[] sl = { "设定时间:", "小时", "分", "秒", "距结束还有:" };
    JLabel[] lb = new JLabel[sl.length];
    for (int i = 0; i < sl.length; i++) {
    lb[i] = new JLabel(sl[i]);
    }
    for (int i = 0; i < 3; i++) {
    jp1.add(lb[i]);
    jp1.add(jtf[i]);
    }
    jp1.add(lb[3]);
    jf.add(jp1);
    // ----------------------------
    JButton jb = new JButton("start");
    jb.addActionListener(this);
    JPanel jp2 = new JPanel();
    jp2.add(jb);
    jf.add(jp2);
    // -----------------------------
    JPanel jp3 = new JPanel();
    jp3.add(lb[4]);
    jp3.add(jtfc);
    jf.add(jp3);
    jf.setSize(300, 200);// 大小
    jf.setLocation(300, 200);// 出现位置
    jf.setVisible(true);// 可见
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } public static void main(String[] args) {
    new Countdown();
    }
    }[/]
      

  3.   

    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.FocusEvent;
    import java.awt.event.FocusListener;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;public class Countdown extends JFrame {

    private static final long serialVersionUID=8999967890123456789l;
    public static void main(String[] args) {
    new Countdown("DouSunny倒计时器");
    } private boolean isStart; private JButton jb = new JButton("Start"); JTextField[] jtf = new JTextField[3]; JTextField jtfc = new JTextField(10); Timer t = new Timer(); private TimerTask task;
    private int time; {
    for (int i = 0; i < jtf.length; i++) {
    jtf[i] = new JTextField(3);
    jtf[i].setText("0");
    jtf[i].addFocusListener(new FocusListener() {
    public void focusGained(FocusEvent e) { } public void focusLost(FocusEvent e) {
    if (e.getSource() instanceof JTextField) {
    JTextField text = (JTextField) e.getSource();
    String textValue = text.getText();
    if (textValue != null && !textValue.equals("")) { try {
    int intValue = Integer.parseInt(textValue);
    text
    .setText((intValue < 0 ? 0 : intValue)
    + "");
    } catch (Exception ex) {
    text.setText("0");
    }
    } else {
    text.setText("0");
    }
    }
    }
    });
    }
    } public Countdown() {
    this("");
    } public Countdown(String title) {
    super(title);
    try {
    init();
    moreInit();
    } catch (Exception e) {
    e.printStackTrace();
    }
    } public void actionPerformeds() {
    if (isStart) {
    task = new TimerTask() { @Override
    public void run() {
    // TODO Auto-generated method stub
    runs();
    } };
    if (time <= 0) {
    int h = Integer.parseInt(jtf[0].getText());
    int f = Integer.parseInt(jtf[1].getText());
    int m = Integer.parseInt(jtf[2].getText());
    time = h * 3600 + f * 60 + m;
    } // this.cancel();
    t.schedule(task, 0, 1000);
    } else {
    task.cancel();
    } } private void init() throws Exception { setLayout(new GridLayout(3, 1));
    JPanel jp1 = new JPanel(new FlowLayout());
    String[] sl = { "设定时间:", "小时", "分", "秒", "距结束还有:" };
    JLabel[] lb = new JLabel[sl.length];
    for (int i = 0; i < sl.length; i++) {
    lb[i] = new JLabel(sl[i]);
    }
    for (int i = 0; i < 3; i++) {
    jp1.add(lb[i]);
    jp1.add(jtf[i]);
    }
    jp1.add(lb[3]);
    add(jp1);
    // JLabel jl = new JLabel();
    // ---------------------------- JPanel jp2 = new JPanel();
    jp2.add(jb);
    add(jp2);
    // -----------------------------
    JPanel jp3 = new JPanel();
    jp3.add(lb[4]);
    jp3.add(jtfc);
    add(jp3);
    setSize(300, 200);// 大小
    setLocation(300, 200);// 出现位置
    setVisible(true);// 可见
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } private void moreInit() {
    jb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    isStart = !isStart;
    jb.setText(isStart ? "Stop" : "Start");
    actionPerformeds();
    } });
    } public void runs() { if (time > 0) {
    time--;
    } else {
    task.cancel();
    isStart = false;
    jb.setText("Start");
    }
    jtfc.setText(time / 3600 + "小时" + time % 3600 / 60 + "分钟" + time % 60
    + "秒");

    System.out.println(time / 3600 + "小时" + time % 3600 / 60 + "分钟" + time
    % 60 + "秒"); }
    }
    测试一下如何插入代码o(^_^)o