I want to add a panel to my ClockAnimation class that displays the time which the clock was started, the time which the clock was stopped, and the time elapsed from start to stop. I would really like it to be in the format of Hour:Minute:Second. Any Help would be appreciated.
My ClockAnimation class:
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();
}
}
My ClockAnimation class uses my StillClock class:
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);
}
}
I have pretty much tried everything I can think of. My assignment that this is for has been fulfilled without displaying these times but I think it would be cool to learn how to add this in. Thanks, Samantha
I am not an expert, but from what I can tell, the best way would be to get the elapsed time is by using System.currentTimeMillis() when you start and when you stop the timer. You can then Subtract the second value from the first in order to find the elapsed time in milliseconds, and then simply divide by 1000 to get seconds.
Example:
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;
}
This is just a snippet, and I know it's not perfect, but this is the best way I know to do it.
In order to get hours and minutes, you would simply take the endElapsedTime and divide it by 60 to get minutes while the remainder would be the seconds. Repeat this process to get the time in hours too, but the remainder would be the minutes instead of the seconds.
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;
}
Hope this helped!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.