this is the code!

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Clock extends JPanel{

    public void paint (Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        String s = "12 1 2 3 4 5 6 7 8 9 10 11";

        Font font = new Font("Courier", Font.BOLD,12);
        g2d.translate(100,200);

        FontRenderContext frc = g2d.getFontRenderContext();

        GlyphVector gv = font.createGlyphVector(frc, s);
        int length = gv.getNumGlyphs();

        for(int i = 0; i < length; i++) {
            Point2D p = gv.getGlyphPosition(i);
            AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY());
            at.rotate((double) i / (double) (length + 25) * Math.toRadians(360));

            Shape glyph = gv.getGlyphOutline(i);
            Shape transformedGlyph = at.createTransformedShape(glyph);

            g2d.fill(transformedGlyph);
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("CLOCK");
        frame.add(new Clock());
        frame.setSize(500,500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}

help pls ican't figure it out...to ma ke it like the numbers in the clock...or is there wrong in this code??

I ran the code and it displays the numbers 1-12 in a circle, like a clock.
Except: the circle is distorted - more like a pear lying on its side, and the numbers are rotated so 12 is upside-down.
So it's safe to conclude that the code basically works, but the exact rotations and translations (AffineTransforms) need some tuning.

Why are you making it so complicated? Also, what you really only need is translate and some rotate point using the angle from a center point in order to get the location of the draw string. Why do you use AffineTransform?

Here is a method I implemented that returns an integer array of point (x,y) given a distance from the center point and radiant (not degree).

private int[] getPointXY(int dist, double rad) {
  int[] res = new int[2];
  res[0] = (int) ((dist * Math.cos(rad)) + dist);
  res[1] = (int) (-1*(dist * Math.sin(rad)) + dist);
  return res;
}

Then when you call it, you need to compute the radiant a bit because by default the computation is counter-clock-wise and the starting point is from the far right of the center point.

for(int i=1; i <= 12; i++) {
  // rotate the point
  // -30 is from -1 (change direction to clock-wise)
  // and 30 (each number is tilted 30 degrees)
  // toRad is the multiplication to convert degree to radiant --> Math.PI/180
  // Math.PI/2 is to tile the starting point from far right to top most
  int[] pt = getPointXY(distance, (-30*i*toRad)+(Math.PI/2));
  // translate the point here
  // draw the string from the center point
  // remmeber that the string location drawn from its bottom left
}

Edited 4 Years Ago by Taywin

Attachments showclock.png 8.35 KB
This article has been dead for over six months. Start a new discussion instead.