您的位置:程序门 -> java -> j2se / 基础类



java小程序时钟代码,请帮忙解释下代码!谢谢!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


java小程序时钟代码,请帮忙解释下代码!谢谢![已结贴,结贴人:kkids]
发表于: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();
}
}
发表于:2007-01-09 14:00:301楼 得分:5
这样解释是没用的

你最好结合api文档,哪个类不知道就看看。那里说的更详细
发表于:2007-01-09 14:09:032楼 得分:0
正在使用jdk文档查,但是有些英文比较难理解,暂时是没办法中的办法!有时间这样查也挺好玩的,但是时间有些问题!所以求助下,自己也努力中.......
发表于:2007-01-09 14:15:083楼 得分:5
不懂的地方单独拿出来问吧
发表于:2007-01-09 14:34:064楼 得分:0
这两段有什么区别啊?
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
}
发表于:2007-01-09 16:34:395楼 得分:70
public   void   setcurrenttime(date   time)         //设置当前时间
{
this.currenttime.settime(time);
}

public   void   setcurrenttime(long   millis)
{
this.currenttime.settimeinmillis(millis);
}
这两个一样,就是设置时间,参数不同而已。第一个传入date,第二个是long(java的时间基本单位就是long,其实date里面也是通过long型来记录时间的)

下面哪个方法是得到长宽


快速检索

最新资讯
热门点击