何らかの理由で、ClockComponent オブジェクトを JPanel オブジェクトに追加しても表示されません。JPanelオブジェクトではなくJFrameオブジェクトに追加すると表示されます...理由がわかりません。この質問をここに投稿する前に調べましたが、役に立ちませんでした。JComponent から継承した ClockComponent オブジェクトを JPanel に表示する方法はありますか? よろしくお願いいたします。
実行時に時計を表示しない私の ClockViewer クラスは次のとおりです。
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);
}
}
参考までに、私の ClockComponent クラスを次に示します。
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);
}
}