计算ClockAnimation类的经过时间

时间:2013-09-09 20:39:00

标签: java

我想在ClockAnimation类中添加一个面板,显示时钟启动的时间,时钟停止的时间以及从开始到停止所经过的时间。我真的希望它的格式为Hour:Minute:Second。任何帮助将不胜感激。

我的ClockAnimation类:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ClockAnimation extends JFrame
{
   //create an instance for StillClock
   private StillClock clock = new StillClock();

   //create buttons
   JButton startButton;
   JButton stopButton;

   //create a timer (1000 milliseconds delay)
   Timer timer = new Timer(1000, new TimerListener());

   public ClockAnimation()
   {
      //create a panel to hold the clock
      JPanel clockPanel = new JPanel();

      //add the clock to panel
      clockPanel.add(clock);

     //create a panel to hold start and stop buttons
      JPanel ButtonPanel = new JPanel();

     //create a start button
      startButton = new JButton("Start");
     //add action listener to startButton
      startButton.addActionListener(new startListener());
     //create a stop button
      stopButton = new JButton("Stop");
     //add action listener to stopButton
      stopButton.addActionListener(new stopListener());
     //add start button to ButtonPanel
      ButtonPanel.add(startButton);
     //add stop button to ButtonPanel
      ButtonPanel.add(stopButton);

      //create elapsedPanel to hold elaped time
      JPanel ElspsedPanel = new JPanel();

      //add start time to panel
      add.(timer.start());
      //add stop time to panel
      add.(timer.stop());
      //add the elapsed time to panel
      ElapsedPanel.add((timer.start())-(timer.stop()));


   //add the clockPanel and ButtonPanel to the frame
      add(clockPanel, BorderLayout.NORTH);
      add(ButtonPanel, BorderLayout.CENTER);
      add(ElapsedPanel, BorderLayout.SOUTH);
   }

   private class startListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         //start clock time
         timer.start();
      }
   }

   private class stopListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         //stop clock time
         timer.stop();
      }
   }

   private class TimerListener implements ActionListener
   {
      public void actionPerformed(ActionEvent e)
      {
         //set current time and paint clock to display current time
         clock.setCurrentTime();
         clock.repaint();
      }
   }

   //main method  
   public static void main(String[] args)
   {
  //create a JFrame instance
  JFrame frame = new ClockAnimation();

     //set title of the frame
  frame.setTitle("My Clock");
     //set location of the frame to center
  frame.setLocationRelativeTo(null);
     //set frame to close on exit
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     //set frame to visable
  frame.setVisible(true);
     //set components to fit in frame
  frame.pack();
   }
}

我的ClockAnimation类使用我的StillClock类:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.util.*;

public class StillClock extends JPanel
{
   //create variables for StillClock
   public int hour;
   private int minute;
   private int second;

   //create a clock with current time
   public StillClock()
   {
  setCurrentTime();
   }

   //create a clock with specified time
   public StillClock(int hour, int minute, int second)
   {
      this.hour = hour;
      this.minute = minute;
      this.second = second;
   }

   //return hour
   public int getHour()
   {
  return hour;
   }

   //set new hour
   public void setHour(int hour)
   {
      this.hour = hour;
  repaint();
   }

    //return minutes
   public int getMinute()
   {
      return minute;
   }

     //set new minute
   public void setMinute(int minute)
   {
      this.minute = minute;
      repaint();
   }

    //return seconds
   public int getSecond()
   {
      return second;
   }

     //set new second
   public void setSecond(int second)
   {
      this.second = second;
      repaint();
   }

   //draw the clock 
   protected void paintComponent(Graphics g)
   {
  super.paintComponent(g);

  int clockRadius = (int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
  int xCenter = getWidth()/ 2;
  int yCenter = getHeight() / 2;

   //draw clock circle
  g.setColor(Color.BLACK);
  g.drawOval(xCenter - clockRadius, yCenter - clockRadius, 2 * clockRadius, 2 * clockRadius);

  g.drawString("12", xCenter - 5, yCenter - clockRadius + 13);
  g.drawString("9", xCenter - clockRadius + 3, yCenter + 5);
  g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
  g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);

   //draw seconds hand
  int sLength = (int)(clockRadius * 0.8);
  int xSecond = (int)(xCenter + sLength * Math.sin(second * (2 * Math.PI/ 60)));
  int ySecond = (int)(yCenter - sLength * Math.cos(second * (2 * Math.PI/ 60)));
  g.drawLine(xCenter, yCenter, xSecond, ySecond);
  g.setColor(Color.red);

   //draw minutes hand
  int mLength = (int)(clockRadius * 0.65);
  int xMinute = (int)(xCenter + mLength * Math.sin(minute * (2 * Math.PI/ 60)));
  int yMinute = (int)(yCenter - mLength * Math.cos(minute * (2 * Math.PI/ 60)));
  g.drawLine(xCenter, yCenter, xMinute, yMinute);
  g.setColor(Color.lightGray);

   //draw hours hand
  int hLength = (int)(clockRadius * 0.8);
  int xHour = (int)(xCenter + hLength * Math.sin(hour * (2 * Math.PI/ 60)));
  int yHour = (int)(yCenter - hLength * Math.cos(hour * (2 * Math.PI/ 60)));
  g.drawLine(xCenter, yCenter, xHour, yHour);
  g.setColor(Color.darkGray);
   }

     //set current time to StillClock variables
   public void setCurrentTime()
   {
   //construct calendar for current time and date
  Calendar calendar = new GregorianCalendar();

   //set current time
  this.hour = calendar.get(Calendar.HOUR_OF_DAY);
  this.minute = calendar.get(Calendar.MINUTE);
  this.second = calendar.get(Calendar.SECOND);
   }

 //get dimensions of JPanel
   public Dimension getPreferredSize()
   {
  return new Dimension(200, 200);
   }
}

我已经尝试了所有我能想到的东西。我的作业已经完成,但没有显示这些时间,但我认为学习如何添加它是很酷的。谢谢, 萨曼莎

1 个答案:

答案 0 :(得分:0)

我不是专家,但据我所知,最好的方法是通过在启动和停止计时器时使用System.currentTimeMillis()来获取已用时间。然后,您可以从第一个值中减去第二个值,以便以毫秒为单位查找经过的时间,然后简单地除以1000得到秒数。

示例:

int startTime;
double currentElapsedTime;
double endElapsedTime;

void start()
{
  timer.start();
  startTime = System.currentTimeMillis();
}

void stop()
{
  timer.stop();
  elapsedTime = getElapsedTime();
}

void getElapsedTime()        //Could be called apart from the stop() function to 
                             //get the elapsed time without stopping the timer
{                              
  currentElapsedTime = (System.currentTimeMillis() - startTime)/1000;
}

这只是一个片段,我知道它并不完美,但这是我所知道的最佳方式。

为了获得小时和分钟,您只需将endElapsedTime除以60得到分钟,剩余部分为秒。重复此过程以获得以小时为单位的时间,但剩余部分将是分钟而不是秒。

String toStandardTime(double elapsedTime)
{
  int hours = 0;
  int minutes = 0;
  int seconds = 0;
  String formattedTime;

  minutes = (int) t/60;
  seconds = (int) t%60;
  hours = (int) minutes/60;
  minutes = (int) minutes%60;

  formattedTime = hours + ":" + minutes + ":" + seconds;
  return formattedTime;
}

希望这有帮助!