一个钟表的实现

plugin.jsp

<html>
<title> Plugin example </title>
<body bgcolor="white">
<h3> Current time is: </h3>
<jsp:plugin type="applet" code="Clock2.java" codebase="test" jreversion="1.2" width="160" height="150">
<jsp:fallback>
Plugin tag OBJECT or EMBED not supported by browser.
</jsp:fallback>
</jsp:plugin>
<p>
<h4>
<font color="red">
The above applet is loaded using the Plugin from a jsp page using the plugin tag.
</font>
</h4>
</body>
</html>

Clock2.java

import java.util.*;
import java.awt.*;
import java.applet.*;
import java.text.*;
/**
* Time!
*
**/
public class Clock2 extends Applet implements Runnable {
Thread timer; // The thread that displays clock
int lastxs, lastys, lastxm, lastym, lastxh, lastyh; // dimensions used to draw hands
SimpleDateFormat formatter; // Formats the date display
String lastdate; // String to hold date display
Font clockFaceFont; // Font for number display on clock
Date currentDate; // Used to get date to display
Color handColor; // Color of main hands and dial
Color numberColor; // Color of second hand and number

public void init() {
int x, y;
lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
formatter = new SimpleDateFormat ("EEE MMM dd hh:mm:ss yyyy", Locale.getDefault());
currentDate = new Date();
lastdate = formatter.format(currentDate);
clockFaceFont = new Font("serif", Font.PLAIN, 14);
handColor = Color.blue;
numberColor = Color.darkGray;

try {
setBackground(new Color(Integer.parseInt(getParameter("bgcolor"), 16)));
} catch(Exception e) {
}

try {
handColor = new Color(Integer.parseInt(getParameter("fgcolor1"), 16));
} catch(Exception e) {
}

try {
numberColor =new Color(Integer.parseInt(getParameter("fgcolor2"), 16));
} catch(Exception e) {
}

resize(300, 300); //Set clock window size
}

// Plotpoints allows calculation to only cover 45 degrees of the circle,
// and then mirror
public void plotpoints(int x0, int y0, int x, int y, Graphics g) {
g.drawLine(x0+x, y0+y, x0+x, y0+y);
g.drawLine(x0+y, y0+x, x0+y, y0+x);

g.drawLine(x0+y, y0-x, x0+y, y0-y);
g.drawLine(x0+x, y0-y, x0+x, y0-y);

g.drawLine(x0-x, y0-y, x0-x, y0-y);
g.drawLine(x0-y, y0-x, x0-y, y0-x);

g.drawLine(x0-y, y0+x, x0-y, y0+x);
g.drawLine(x0-x, y0+y, x0-x, x0+y);
}

//Circle is just Bresenham's algorithm for a scan converted circle
public void circle(int x0, int y0, int r, Graphics g) {
int x, y;
float d;
x = 0;
y = r;
d = 5/4-r;
plotpoints(x0, y0, x, y, g);
while(y>x) {
if(d<0) {
d = d+2*x+3;
x++;
} else {
d = d+2*(x-y)+5;
x++;
y--;
}
plotpoints(x0, y0, x, y, g);
}
}

//Paint is the main part of the program
public void paint(Graphics g) {
int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter;
String today;
currentDate = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("s", Locale.getDefault());
try {
s = Integer.parseInt(formatter.format(currentDate));
} catch(NumberFormatException n) {
s = 0;
}
formatter.applyPattern("m");
try {
m = Integer.parseInt(formatter.format(currentDate));
} catch(NumberFormatException n) {
m = 10;
}
formatter.applyPattern("h");
try {
h = Integer.parseInt(formatter.format(currentDate));
} catch(NumberFormatException n) {
h = 10;
}
formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");
today = formatter.format(currentDate);
xcenter = 80;
ycenter = 55;
// a = s*pi/2 - pi/2(to switch 0,0 from 3:00 to 12:00)
// x = r(cos a) + xcenter, y = r(sin a) + ycenter
xs = (int)(Math.cos(s*3.14f/30 - 3.14f/2)*45 + xcenter);
ys = (int)(Math.sin(s*3.14f/30 - 3.14f/2)*45 + ycenter);
xm = (int)(Math.cos(m*3.14f/30 - 3.14f/2)*45 + xcenter);
ym = (int)(Math.sin(m*3.14f/30 - 3.14f/2)*45 + ycenter);
xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter);
yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter);
// Draw the circle and numbers
g.setFont(clockFaceFont);
g.setColor(handColor);
circle(xcenter, ycenter, 50, g);
g.drawString("9", xcenter-45, ycenter+3);
g.drawString("3", xcenter+40, ycenter+3);
g.drawString("12", xcenter-5, ycenter-37);
g.drawString("6", xcenter-3, ycenter+45);
// Erase if necessary, and redraw
g.setColor(getBackground());
if(xs != lastxs || ys != lastys) {
g.drawLine(xcenter, ycenter, lastxs, lastys);
g.drawString(lastdate, 5, 125);
}
if(xm != lastxm || ym != lastym) {
g.drawLine(xcenter, ycenter-1, lastxh, lastyh);
g.drawLine(xcenter-1, ycenter, lastxh, lastyh);
}
g.setColor(numberColor);
g.drawString("", 5, 125);
g.drawString(today, 5, 125);
g.drawLine(xcenter, ycenter, xs, ys);
g.setColor(handColor);
g.drawLine(xcenter, ycenter-1, xm, ym);
g.drawLine(xcenter-1, ycenter, xm, ym);
g.drawLine(xcenter, ycenter-1, xh, yh);
g.drawLine(xcenter-1, ycenter, xh, yh);
lastxs = xs;
lastys = ys;
lastxm = xm;
lastym = ym;
lastxh = xh;
lastyh = yh;
lastdate = today;
currentDate = null;
}

public void start() {
timer = new Thread(this);
timer.start();
}
public void stop() {
timer = null;
}
public void run() {
Thread me = Thread.currentThread();
while(timer == me) {
try {
Thread.currentThread().sleep(100);
} catch(InterruptedException e) {
}
repaint();
}
}
public void update(Graphics g) {
paint(g);
}
public String getAppletInfo() {
return "Title: A Clock \nAuthor: Rachel Gollub, 1995 \nAn analog clock.";
}
public String[][] getParameterInfo() {
String[][] info = {
{"bgcolor", "hexadecimal RGB number", "The background color. Default is the color of your browser."},
{"fgcolor1", "hexadecimal RGB number", "The color of the hands and dial. Default is blue."},
{"fgcolor2", "hexadecimal RGB number", "The color of the seconds hand and numbers. Default is dark gray."}
};
return info;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值