Sans plus attendre, voici le code :
package org.clock; import java.util.Calendar; import javax.media.opengl.GL; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLEventListener; import javax.swing.JFrame; import com.sun.opengl.util.FPSAnimator; public class Clock implements GLEventListener { private int heure, minute, seconde, cadran; private int minTic, heureTic; public static void main(String[] args) { new Clock(); } public Clock() { JFrame frame = new JFrame("Horloge"); GLCanvas canvas = new GLCanvas(); canvas.addGLEventListener(this); FPSAnimator animator = new FPSAnimator(canvas, 24); animator.start(); frame.add(canvas); frame.setSize(600,600); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } public void createHeure(GL gl) { this.heure = gl.glGenLists(1); gl.glNewList(this.heure, GL.GL_COMPILE); gl.glColor4f(0.30f, 0.36f, 0.65f, 0.8f); gl.glBegin(GL.GL_QUADS); gl.glVertex2f(0f, 0.65f); gl.glVertex2f(0.04f, 0f); gl.glVertex2f(0f, -0.05f); gl.glVertex2f(-0.04f, 0f); gl.glEnd(); gl.glEndList(); } public void createMinute(GL gl) { this.minute = gl.glGenLists(1); gl.glNewList(this.minute, GL.GL_COMPILE); gl.glColor4f(0.61f, 0.64f, 0.82f, 0.8f); gl.glBegin(GL.GL_QUADS); gl.glVertex2f(0f, 0.85f); gl.glVertex2f(0.04f, 0f); gl.glVertex2f(0f, -0.04f); gl.glVertex2f(-0.04f, 0f); gl.glEnd(); gl.glEndList(); } public void createSeconde(GL gl) { this.seconde = gl.glGenLists(1); gl.glNewList(this.seconde, GL.GL_COMPILE); gl.glColor4f(0.94f, 0.97f, 0.81f, 0.9f); // gl.glBegin(GL.GL_LINE_STRIP); // gl.glVertex2f(0f, 0.95f); // gl.glVertex2f(0.06f, 0.75f); // gl.glVertex2f(0.04f, 0.80f); // gl.glVertex2f(0.02f, 0.75f); gl.glBegin(GL.GL_QUADS); gl.glVertex2f(0f, 0.85f); gl.glVertex2f(0.02f, 0f); gl.glVertex2f(0f, -0.02f); gl.glVertex2f(-0.02f, 0f); gl.glEnd(); gl.glEndList(); } public void createHeureTic(GL gl) { this.heureTic = gl.glGenLists(1); gl.glNewList(this.heureTic, GL.GL_COMPILE); gl.glColor4f(0.30f, 0.36f, 0.65f, 1f); gl.glBegin(GL.GL_QUADS); gl.glVertex2f(0f, 1f); gl.glVertex2f(0.02f, 0.98f); gl.glVertex2f(0f, 0.90f); gl.glVertex2f(-0.02f, 0.98f); gl.glEnd(); gl.glEndList(); } public void createMinTic(GL gl) { this.minTic = gl.glGenLists(1); gl.glNewList(this.minTic, GL.GL_COMPILE); gl.glColor4f(0.61f, 0.64f, 0.82f, 1f); gl.glBegin(GL.GL_QUADS); gl.glVertex2f(0f, 0.94f); gl.glVertex2f(0.01f, 0.92f); gl.glVertex2f(0f, 0.90f); gl.glVertex2f(-0.01f, 0.92f); gl.glEnd(); gl.glEndList(); } public void createCadran(GL gl) { this.cadran = gl.glGenLists(1); gl.glNewList(this.cadran, GL.GL_COMPILE); gl.glPushMatrix(); for(int i=0; i<12; i++) { gl.glRotated(30, 0, 0, 1); gl.glCallList(this.heureTic); } gl.glPopMatrix(); gl.glPushMatrix(); for(int i=0; i<60; i++) { if(i%5 != 0 && i != 0) { gl.glCallList(this.minTic); } gl.glRotated(6, 0, 0, 1); } gl.glPopMatrix(); gl.glEndList(); } public void display(GLAutoDrawable drawable) { Calendar c = Calendar.getInstance(); float heure = c.get(Calendar.HOUR_OF_DAY)%12; float minute = c.get(Calendar.MINUTE); float seconde = c.get(Calendar.SECOND); float milliseconde = c.get(Calendar.MILLISECOND); float aHeure = 360-(30f*heure+0.5f*minute+0.0083f*seconde+0.0000083f*milliseconde); float aMinute = 360-(6f*minute+0.1f*seconde+0.0001f*milliseconde); float aSeconde = 360-(6f*seconde+0.006f*milliseconde); GL gl = drawable.getGL(); gl.glEnable(GL.GL_BLEND); gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL.GL_LINE_SMOOTH); gl.glClear(GL.GL_COLOR_BUFFER_BIT); //On efface le contenu gl.glCallList(this.cadran); gl.glPushMatrix(); gl.glRotated(aHeure, 0, 0, 1); gl.glCallList(this.heure); gl.glPopMatrix(); gl.glPushMatrix(); gl.glRotated(aMinute, 0, 0, 1); gl.glCallList(this.minute); gl.glPopMatrix(); gl.glPushMatrix(); gl.glRotated(aSeconde, 0, 0, 1); gl.glCallList(this.seconde); gl.glPopMatrix(); } public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {} public void init(GLAutoDrawable drawable) { GL gl = drawable.getGL(); gl.glClearColor(0.81f, 0.83f, 0.91f, 0.4f); this.createHeureTic(gl); this.createMinTic(gl); this.createCadran(gl); this.createHeure(gl); this.createMinute(gl); this.createSeconde(gl); } public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {} }