我想在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);
}
}
我已经尝试了所有我能想到的东西。我的作业已经完成,但没有显示这些时间,但我认为学习如何添加它是很酷的。谢谢, 萨曼莎
答案 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;
}
希望这有帮助!