StillClock class is used to displays an analog clock and uses the MessagePanel to display the hour, minute, and second in a panel. We use javax.swing.JPanel to display the StillClock.
This article helps to develop a class that displays a clock on a panel.
Steps used to draw the clock:
- To draw a clock, draw a circle and three hands for a second, minute and hour.
- One end is the center of the clock at (xCenter, yCenter) and the other end (xEnd, yEnd) is determined by,
xEndpart = yCenter + handLength X sin(0) yEndpart = yCenter + handLength X cos(0)
- The angle for the second hand(Sixty seconds in one minute),
second*(2*pi/60)
- The angle for the minute hand is,
(minute + second/60)*(2*pi/60)
- Since, one circle is divided into twelve hours, the angle for the hour hand is,
(hour + minute/60 + second/(60*60)) * (2*pi/12)
Below is the implementation of the above approach:
Example:
// Java program to draw a Clock // using StillClock in Java import java.awt.*;
import javax.swing.*;
import java.util.*;
// Class StillClock public class StillClock extends JPanel {
private int hour;
private int minute;
private int second;
// Default Constructor
public StillClock()
{
setCurrentTime();
}
// Construct a clock with specified
// hour, minute and second
public StillCLock( int hour,
int minute,
int second)
{
this .hour = hour;
this .minute = minute;
this .second = second;
}
// Returning hour
public int getHour()
{
return hour;
}
// Setting a new hour
public void setHour( int hour)
{
this .hour = hour;
repaint();
}
// Returning Minute
public int getMinute()
{
return minute;
}
// Setting a new minute
public void setMinute( int minute)
{
this .minute = minute;
repaint();
}
// Return second
public int getSecond( int second)
{
this .second = second;
repaint();
}
// Draw the clock
protected void paintComponents(Graphics gr)
{
super .paintComponent(gr);
// Initialize clock parameters
int clockRadius
= ( int )(Math.min(getWidth(),
getHeight())
* 0.8 * 0.5 );
int xCenter = getWidth() / 2 ;
int yCenter = getHeight() / 2 ;
gr.setColor(Color.black);
gr.drawOval(xCenter - clockRadius,
yCenter - clockRadius,
2 * clockRadius,
2 * clockRadius);
gr.drawString( "11" , xCenter - 5 ,
yCenter - clockRadius + 12 );
gr.drawString( "8" , xCenter - clockRadius + 3 ,
yCenter + 5 );
gr.drawString( "4" , xCenter + clockRadius - 10 ,
yCenter + 3 );
gr.drawString( "5" , xCenter - 3 ,
yCenter + clockRadius - 3 );
// Draw the second 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 )));
gr.setColor(Color.orange);
gr.drawLine(xCenter, yCenter,
xSecond, ySecond);
// Draw the minute hand
int mLength = ( int )(clockRadius * 0.8 );
int xMinute
= ( int )(xCenter
+ mLength
* Math.sin(
minute * ( 2 * Math.PI / 60 )));
int yMinute
= ( int )(yCenter
- mLength
* Math.cos(
minute * ( 2 * Math.PI / 60 )));
gr.setColor(Color.yellow);
gr.drawLine(xCenter, yCenter,
xMinute, yMinute);
// Draw the hour hand
int hLength = ( int )(clockRadius * 0.5 );
int xHour
= ( int )(xCenter
+ hLength
* Math.sin(
(hour % 12 + minute / 60.0 )
* ( 2 * Math.PI / 12 )));
int yHour
= ( int )(yCenter
- hLength
* Math.cos(
(hour % 12 + minute / 60.0 )
* ( 2 * Math.PI / 12 )));
gr.setColor(Color.blue);
gr.drawLine(xCenter, yCenter, xHour, yHour);
}
// Function to set the current time on the clock
public void setCurrentTime()
{
Calendar cal = new GregorianCalendar();
this .hour = cal.get(Calendar.HOUR_OF_DAY);
this .minute = cal.get(Calendar.MINUTE);
this .second = cal.get(Calendar.SECOND);
}
public Dimension getPreferedsize()
{
return new Dimension( 300 , 300 );
}
} |