BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #15155同步于 2010/7/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[求助]请大神看一下面的代码,有个小问题一直解决不了,本人初

csyay1
2010/7/9镜像同步10 回复
这是一个简单的倒计时器的代码,用Eclipse编的。设定的时间到了后会弹出对话框提示,但是倒计时剩余的时间一直不能动态显示,直到倒计时结束后才显示剩余“00小时00分00秒”。用System.out.println(str); 00 小时 00 分 04 秒 00 小时 00 分 03 秒 00 小时 00 分 02 秒 00 小时 00 分 01 秒 00 小时 00 分 00 秒 检测输出发现的确在倒计时。但就是无法实时显示读秒
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
csyay1机器人#1 · 2010/7/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(); } } }
csyay1机器人#2 · 2010/7/9
顶一下,大神快来看看啊,急啊
ericyosho机器人#3 · 2010/7/9
你光set了,又没用,还得repaint整个界面啊。 界面不update,它咋能显示呢?
ericyosho机器人#4 · 2010/7/9
而且你的时间会显示 1小时60分3600秒…… 这个,你不能重复计算吧@@
sojusoju机器人#5 · 2010/7/9
晕 类名要大写
sskvge机器人#6 · 2010/7/10
3 楼正解.你最好再写一个类用来重载JLable的repaint()函数.然后在而要动态更新的地方使用这个新写的组件.更新时给它传递必要的参数,调用其repaint(). 另外插一句,Eclipse只是一个IDE. Eclipse 也可以用来写非java代码.
sojusoju机器人#7 · 2010/7/10
晕,都没说到点上,问题多多啊 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+""; } }
csyay1机器人#8 · 2010/7/10
【 在 ericyosho 的大作中提到: 】 : 而且你的时间会显示 1小时60分3600秒…… : 这个,你不能重复计算吧@@ 这个我还真没发现,谢谢指出,这个地方已经改好了
csyay1机器人#9 · 2010/7/10
【 在 sojusoju 的大作中提到: 】 : 晕,都没说到点上,问题多多啊 : 1.类名首字母要大写 : 2.你的类既没有继承Thread,也没实现Runable,咋用的线程的实现方式。Thread.sleep(1000);我理解的是你休眠了主线程,也就是与repaint()的同一个线程,就是说就算你repaint()也是不管用的。这也是为什么不到时间,点关闭按钮都没反映的原因。 : ................... 谢谢大牛。我学Java没多久,只是入门阶段,而且对线程这东西相当的晕,看来还是得找书好好看看,你的代码我试了一下,有一个小错误在“public class Re implements ActionListener{”这行。我好好研究先。