| 发表于:2007-01-09 13:46:01 楼主 |
由于有些类还没学好,所以对程序的绘图不怎么明白,可以帮忙讲解下或者加点注释吗?谢谢了! import java.awt.*; import java.awt.geom.ellipse2d; import java.awt.geom.generalpath; import java.awt.geom.line2d; import java.awt.geom.rectangle2d; import java.util.calendar; import java.util.date; import javax.swing.borderfactory; import javax.swing.jcomponent; import javax.swing.jframe; import javax.swing.uimanager; public class clock extends jcomponent { private static final color integral_color = new color(0, 128, 128); private int radius; private calendar currenttime = calendar.getinstance(); private double s = 0.03; public clock(int radius) { this.radius = radius; } public void setcurrenttime(date time) //设置当前时间 { this.currenttime.settime(time); } public void setcurrenttime(long millis) { this.currenttime.settimeinmillis(millis); } public dimension getpreferredsize() { insets insets = getinsets(); int r = (int) (radius == -1 ? 0 : radius*(1+s))+1; return new dimension(r * 2 + insets.left + insets.right,r * 2 + insets.top + insets.bottom); //返回一个指定宽、高的dimension } protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g; g2d.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on); insets insets = getinsets(); int wid = getwidth() - insets.left - insets.right; int hei = getheight() - insets.top - insets.bottom; int r = (int) ((math.min(wid, hei)) / 2 / (1+s)); g2d.translate(insets.left + r * (1+s), insets.top + r * (1+s)); g2d.scale(1, -1); for (int i = 0; i < 60; i++) { int angle = 90 - i * 6; double pos[] = calcpos(r, angle); paintminutedot(r, g2d, pos[0], pos[1], i % 5 == 0); } painthourpointer(r, g2d); paintminutepointer(r, g2d); paintsecondpointer(r, g2d); paintcenterpoint(g2d); g2d.scale(1, -1); g2d.translate(-insets.left - r * (1+s), -insets.top - r * (1+s)); } private void paintcenterpoint(graphics2d g2d) { g2d.setcolor(color.blue); rectangle2d rect = new rectangle2d.double(-2, -2, 4, 4); g2d.fill(rect); } private void paintminutepointer(int r, graphics2d g2d) { int minute = currenttime.get(calendar.minute); int second = currenttime.get(calendar.second); double angle = 90 - (minute + second / 60.0) * 6; shape pointershape = createpointershape(r * 0.8, r * 0.04, r * 0.08, angle); g2d.setcolor(color.light_gray); g2d.fill(pointershape); g2d.setcolor(color.dark_gray); g2d.draw(pointershape); } private void painthourpointer(int r, graphics2d g2d) { int hour = currenttime.get(calendar.hour); int minute = currenttime.get(calendar.minute); int second = currenttime.get(calendar.second); double angle = 90 - (hour + minute / 60.0 + second / 3600.0) * 30; shape pointershape = createpointershape(r * 0.6, r * 0.06, r * 0.1, angle); g2d.setcolor(color.light_gray); g2d.fill(pointershape); g2d.setcolor(color.dark_gray); g2d.draw(pointershape); } private shape createpointershape(double r1, double r2, double r3, double angle) { generalpath gp = new generalpath(); double[] pos = calcpos(r1, angle); double[] pos1 = calcpos(r2, angle + 90); gp.append(new line2d.double(pos[0], pos[1], pos1[0], pos1[1]), true); double[] pos2 = calcpos(r3, angle + 180); gp.lineto((float)pos2[0], (float)pos2[1]); double[] pos3 = calcpos(r2, angle + 270); gp.lineto((float)pos3[0], (float)pos3[1]); gp.closepath(); return gp; } private void paintsecondpointer(int r, graphics2d g2d) { g2d.setcolor(color.black); int second = currenttime.get(calendar.second); int angle = 90 - second * 6; double pos[] = calcpos(r * 0.9, angle); double pos1[] = calcpos(r * 0.2, angle + 180); line2d line = new line2d.double(pos1[0], pos1[1], pos[0], pos[1]); g2d.draw(line); } private void paintminutedot(int r, graphics2d g2d, double x, double y, boolean flag) { g2d.setcolor(flag ? color.red : color.black); if (flag) { //rectangle2d rect = new rectangle2d.double( ellipse2d rect = new ellipse2d.double( x - r * s, y - r * s, r * s * 2, r * s * 2); g2d.fill(rect); } else { //rectangle2d rect = new rectangle2d.double( ellipse2d rect = new ellipse2d.double( x - r * 0.02, y - r * 0.02, r * 0.04, r * 0.04); g2d.fill(rect); } } private double[] calcpos(double r, double angle) { double radian = math.toradians(angle); double x = r * math.cos(radian); double y = r * math.sin(radian); return new double[] {x, y}; } public static void main(string[] args) { try { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } catch (exception e) { e.printstacktrace(); } final clock clock = new clock(50); clock.setborder(borderfactory.createemptyborder(10, 10, 10, 10)); jframe f = new jframe( "软件4班 3104007114 彭洪钰 "); //f.setbounds(380,200,500,600); f.getcontentpane().add(clock, borderlayout.center); f.pack(); f.setlocationrelativeto(null); f.setdefaultcloseoperation(jframe.exit_on_close); f.setvisible(true); new thread() { public void run() { while (true) { try { thread.sleep(1000); } catch (interruptedexception ex) { ex.printstacktrace(); } clock.setcurrenttime(system.currenttimemillis()); clock.repaint(); } } }.start(); } } |
|
|
|
|