返回信息流这是一个简单的倒计时器的代码,用Eclipse编的。设定的时间到了后会弹出对话框提示,但是倒计时剩余的时间一直不能动态显示,直到倒计时结束后才显示剩余“00小时00分00秒”。用System.out.println(str);
00 小时 00 分 04 秒
00 小时 00 分 03 秒
00 小时 00 分 02 秒
00 小时 00 分 01 秒
00 小时 00 分 00 秒
检测输出发现的确在倒计时。但就是无法实时显示读秒
这是一条镜像帖。来源:北邮人论坛 / java / #15155同步于 2010/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[求助]请大神看一下面的代码,有个小问题一直解决不了,本人初
csyay1
2010/7/9镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class countdown extends JFrame implements ActionListener
{
private static final long serialVersionUID = -3439634693767815667L;
private JLabel pastTimelabel,label1,label2,label3,lhour,lmin,lsec;
private JTextField hour,min,sec;
private JButton ok;
private String str;
private int h,mi,s;
public countdown()
{
super("倒计时牌");
init();
this.setSize(450,150);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int h = (int) d.getHeight() / 4;
int w = (int) d.getWidth() / 4;
this.setLocation(w, h);
this.setVisible(true);
this.setResizable(true);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
int exit=JOptionPane.showConfirmDialog(countdown.this, "确定退出吗?", "退出", JOptionPane.OK_CANCEL_OPTION);
if(exit==JOptionPane.OK_OPTION)
System.exit(0);
}
});
}
private void init()
{
label1=new JLabel("现在距规定时间还有:");
label2=new JLabel();
label3=new JLabel("倒计时间设定:");
pastTimelabel=new JLabel("已过时间:");
JPanel north=new JPanel();
north.setLayout(new BorderLayout());
north.add(label1,BorderLayout.CENTER);
JPanel south=new JPanel();
south.setLayout(new BorderLayout());
JPanel south_center=new JPanel();
hour=new JTextField("00",4);
min=new JTextField("00",4);
sec=new JTextField("00",4);
lhour=new JLabel("时");
lmin=new JLabel("分");
lsec=new JLabel("秒");
ok=new JButton("开始倒计时");
south_center.add(label3);
south_center.add(hour);
south_center.add(lhour);
south_center.add(min);
south_center.add(lmin);
south_center.add(sec);
south_center.add(lsec);
south_center.add(ok);
south.add(label2);
south.add(south_center,BorderLayout.CENTER);
south.add(pastTimelabel,BorderLayout.NORTH);
this.add(north,BorderLayout.NORTH);
this.add(label2,BorderLayout.CENTER);
this.add(south,BorderLayout.SOUTH);
ok.addActionListener(this);
label1.setFont(new Font("宋体",Font.BOLD,20));
label2.setFont(new Font("宋体",Font.BOLD,26));
label3.setFont(new Font("宋体",Font.BOLD,20));
label1.setForeground(new Color(154,0,102));
label2.setForeground(Color.RED);
label3.setForeground(new Color(154,0,102));
}
public void run()
{
Calendar startCalendar = Calendar.getInstance();
long startTime = startCalendar.getTime().getTime(); // 获得开始时候的那个时间点
long endTime = startTime + h * 60 * 60 * 1000+mi*60*1000+s*1000; // 从开始时刻开始 加上输入的时间
long nowTime, leftTime,pastTime;
int leftSec, leftMin,leftHour,pastHour,pastMin,pastSec;
Calendar now;
while(true){
now = Calendar.getInstance();
nowTime = now.getTime().getTime();
leftTime = endTime - nowTime;// 结束时间减去现在的系统的时间构成倒计时
leftSec = (int)(leftTime / 1000);
leftMin = (int)(leftTime / (60 * 1000));
leftHour= (int)(leftTime / (60*60*1000));
pastTime= nowTime- startTime;
pastSec = (int)(pastTime / 1000);
pastMin = (int)(pastTime / (60 * 1000));
pastHour= (int)(pastTime / (60*60*1000));
String aa=intToString(leftHour)+" 小时 "+intToString(leftMin)+" 分 "+intToString(leftSec)+" 秒";
label2.setText(aa);
System.out.println(aa);
String bb=intToString(pastHour)+" 小时 "+intToString(pastMin)+" 分 "+intToString(pastSec)+" 秒";
pastTimelabel.setText("已过时间:"+bb);
if(leftTime<=0){
JOptionPane.showMessageDialog(countdown.this, "时间到");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public String intToString(int i){
if(i<10){
str="0"+i;
return str;
}
else
return i+"";
}
public void actionPerformed(ActionEvent e)
{
String str=e.getActionCommand();
System.out.println(str);
if(str.equals("开始倒计时")){
try {
h=Integer.parseInt(hour.getText());
mi=Integer.parseInt(min.getText());
s=Integer.parseInt(sec.getText());
}catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(this, "对不起,请输入数字!", "错误提示", JOptionPane.ERROR_MESSAGE);
}
}
run();
}
public static void main(String[] args)
{
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new countdown();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
}
3 楼正解.你最好再写一个类用来重载JLable的repaint()函数.然后在而要动态更新的地方使用这个新写的组件.更新时给它传递必要的参数,调用其repaint().
另外插一句,Eclipse只是一个IDE. Eclipse 也可以用来写非java代码.
晕,都没说到点上,问题多多啊
1.类名首字母要大写
2.你的类既没有继承Thread,也没实现Runable,咋用的线程的实现方式。Thread.sleep(1000);我理解的是你休眠了主线程,也就是与repaint()的同一个线程,就是说就算你repaint()也是不管用的。这也是为什么不到时间,点关闭按钮都没反映的原因。
3.repaint()与事件处理是同一个线程,就是说你想在事件处理中repaint()需要重开线程,否则就会等方法返回的时候才repaint()
4.建议使用javax.swing.Timer;
随便改了下,你可以参考
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Countdown extends JFrame implements ActionListener {
private static final long serialVersionUID = -3439634693767815667L;
private JLabel pastTimelabel, label1, label2, label3, lhour, lmin, lsec;
private JTextField hour, min, sec;
private JButton ok;
private String str;
private int h, mi, s;
private JPanel north, south, south_center;
public Countdown() {
super("倒计时牌");
label1 = new JLabel("现在距规定时间还有:");
label2 = new JLabel();
label3 = new JLabel("倒计时间设定:");
pastTimelabel = new JLabel("已过时间:");
north = new JPanel();
north.setLayout(new BorderLayout());
north.add(label1, BorderLayout.CENTER);
south = new JPanel();
south.setLayout(new BorderLayout());
south_center = new JPanel();
hour = new JTextField("00", 4);
min = new JTextField("00", 4);
sec = new JTextField("00", 4);
lhour = new JLabel("时");
lmin = new JLabel("分");
lsec = new JLabel("秒");
ok = new JButton("开始倒计时");
south_center.add(label3);
south_center.add(hour);
south_center.add(lhour);
south_center.add(min);
south_center.add(lmin);
south_center.add(sec);
south_center.add(lsec);
south_center.add(ok);
south.add(label2);
south.add(south_center, BorderLayout.CENTER);
south.add(pastTimelabel, BorderLayout.NORTH);
south.setVisible(true);
ok.addActionListener(this);
label1.setFont(new Font("宋体", Font.BOLD, 20));
label2.setFont(new Font("宋体", Font.BOLD, 26));
label3.setFont(new Font("宋体", Font.BOLD, 20));
label1.setForeground(new Color(154, 0, 102));
label2.setForeground(Color.RED);
label3.setForeground(new Color(154, 0, 102));
this.add(north, BorderLayout.NORTH);
this.add(label2, BorderLayout.CENTER);
this.add(south, BorderLayout.SOUTH);
this.setSize(450, 150);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int h = (int) d.getHeight() / 4;
int w = (int) d.getWidth() / 4;
this.setLocation(w, h);
this.setVisible(true);
this.setResizable(true);
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
int exit = JOptionPane.showConfirmDialog(Countdown.this,
"确定退出吗?", "退出", JOptionPane.OK_CANCEL_OPTION);
if (exit == JOptionPane.OK_OPTION)
System.exit(0);
}
});
}
public void actionPerformed(ActionEvent e) {
String str = e.getActionCommand();
System.out.println(str);
if (str.equals("开始倒计时")) {
try {
h = Integer.parseInt(hour.getText());
mi = Integer.parseInt(min.getText());
s = Integer.parseInt(sec.getText());
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(this, "对不起,请输入数字!", "错误提示",
JOptionPane.ERROR_MESSAGE);
}
}
new Re(pastTimelabel);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
new Countdown();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JLabel;
import javax.swing.Timer;
public class Re implements ActionListener{
/**
* @param args
*/
private Timer timeTimer=null;
private JLabel j;
private int pastSec;
public Re(JLabel jabel){
j=jabel;
this.timeTimer=new Timer(1000,this);
this.timeTimer.setRepeats(true);
this.timeTimer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
pastSec =pastSec+1 ;
String bb=intToString(0)+" 小时 "+intToString(0)+" 分 "+intToString(pastSec)+" 秒";
j.setText("已过时间:"+bb);
}
public String intToString(int i){
String str="";
if(i<10){
str="0"+i;
return str;
}
else
return i+"";
}
}
【 在 ericyosho 的大作中提到: 】
: 而且你的时间会显示 1小时60分3600秒……
: 这个,你不能重复计算吧@@
这个我还真没发现,谢谢指出,这个地方已经改好了
【 在 sojusoju 的大作中提到: 】
: 晕,都没说到点上,问题多多啊
: 1.类名首字母要大写
: 2.你的类既没有继承Thread,也没实现Runable,咋用的线程的实现方式。Thread.sleep(1000);我理解的是你休眠了主线程,也就是与repaint()的同一个线程,就是说就算你repaint()也是不管用的。这也是为什么不到时间,点关闭按钮都没反映的原因。
: ...................
谢谢大牛。我学Java没多久,只是入门阶段,而且对线程这东西相当的晕,看来还是得找书好好看看,你的代码我试了一下,有一个小错误在“public class Re implements ActionListener{”这行。我好好研究先。