For some reason, my ClockComponent object does not show up when I add it to a JPanel object. It DOES show up when I add it to a JFrame object but not a JPanel object... I don't understand why and I've looked it up before posting this question here but to no avail. Is there any way to make my ClockComponent object which inherits from JComponent to show up on a JPanel? Thank you so much for your help in advance.
Here's my ClockViewer class which won't display a clock when run:
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ClockViewer
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Clock viewer");
frame.setSize(500, 500);
JPanel panel = new JPanel();
ClockComponent comps = new ClockComponent(7, 40);
panel.add(comps);
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
And here's my ClockComponent class for reference:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JComponent;
public class ClockComponent extends JComponent
{
final int CENTER = 150;
final double HOUR_HAND_LENGTH = 20;
final double MINUTE_HAND_LENGTH = 40;
private Line2D.Double hourHand;
private Line2D.Double minuteHand;
public ClockComponent(double hour, double minute)
{
hourHand = new Line2D.Double(CENTER, CENTER,
CENTER, CENTER - HOUR_HAND_LENGTH);
minuteHand = new Line2D.Double(CENTER, CENTER,
CENTER, CENTER - MINUTE_HAND_LENGTH);
final int HOURS_ON_CLOCK = 12;
final int MINUTES_IN_HOUR = 60;
final double HOURS_TO_RADIANS = 2 * Math.PI / HOURS_ON_CLOCK;
final double MINUTES_TO_RADIANS = 2 * Math.PI / MINUTES_IN_HOUR;
hourHand.setLine(CENTER, CENTER, CENTER + HOUR_HAND_LENGTH *
Math.sin((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS),
CENTER - HOUR_HAND_LENGTH *
Math.cos((hour + minute / MINUTES_IN_HOUR) * HOURS_TO_RADIANS));
minuteHand.setLine(CENTER, CENTER,
CENTER + MINUTE_HAND_LENGTH * Math.sin(minute * MINUTES_TO_RADIANS),
CENTER - MINUTE_HAND_LENGTH * Math.cos(minute * MINUTES_TO_RADIANS));
}
public void paintComponent(Graphics g)
{
final int DIAMETER = 100;
final int POS_X_Y = CENTER - DIAMETER / 2;
Graphics2D g2 = (Graphics2D) g;
Ellipse2D.Double clockFace =
new Ellipse2D.Double(POS_X_Y, POS_X_Y, DIAMETER, DIAMETER);
g2.draw(clockFace);
g2.draw(hourHand);
g2.draw(minuteHand);
}
}