import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* æ¶éç¨åº
*/
public class Clock extends JFrame
{
// ä»å¤©çæ¥æ对象
private GregorianCalendar now = new GregorianCalendar();
// æ¶éæ ç¾ï¼ä¸é¢ç»çæ¯åå½¢æ¶é
private ClockLabel clockLabel = new ClockLabel();
// æææ ç¾ï¼æ示ææ
private JLabel weekLabel = new JLabel();
// æ¥ææ ç¾ï¼æ示æ¥æ
private JLabel dateLabel = new JLabel();
// åçæ ç¾
private JLabel remarkLabel = new JLabel();
// æ¶é´æ ç¾ï¼æ示æ¶é´
private JLabel timeLabel = new JLabel();
public Clock()
{
// 设置主çé¢å±æ§
setTitle("æ¶é");
setSize(500, 480);
setLocation(100, 100);
init();
setResizable(false);
}
private void init()
{
// åå§ååçæ ç¾
remarkLabel.setText("MyClock");
remarkLabel.setLocation(225, 80);
remarkLabel.setSize(100, 30);
remarkLabel.setFont(new Font("Bookman Old Style", Font.BOLD, 15));
remarkLabel.setForeground(Color.darkGray);
// åå§åæææ ç¾
weekLabel.setSize(60, 20);
weekLabel.setLocation(315, 190);
weekLabel.setForeground(Color.darkGray);
weekLabel.setFont(new Font("Arial Narrow", Font.BOLD, 12));
// 为æææ ç¾èµå¼
int week = now.get(Calendar.DAY_OF_WEEK);
switch (week)
{
case 1:
weekLabel.setText("SUNDAY");
break;
case 2:
weekLabel.setText("MONDAY");
break;
case 3:
weekLabel.setText("TUESDAY");
break;
case 4:
weekLabel.setText("WEDNESDAY");
break;
case 5:
weekLabel.setText("THURSDAY");
break;
case 6:
weekLabel.setText("FRIDAY");
break;
case 7:
weekLabel.setText("SATURDAY");
break;
}
// åå§åæ¥ææ ç¾
dateLabel.setSize(20, 20);
dateLabel.setLocation(370, 190);
dateLabel.setForeground(Color.darkGray);
dateLabel.setFont(new Font("Fixedsys", Font.BOLD, 12));
// 设置æ¥ææ ç¾çå¼
dateLabel.setText("" + now.get(Calendar.DATE));
// åå§åæ¶é´æ ç¾
timeLabel.setSize(500, 30);
timeLabel.setLocation(100, 400);
timeLabel.setForeground(new Color(0, 64, 128));
timeLabel.setFont(new Font("Fixedsys", Font.PLAIN, 15));
// å°åç»ä»¶å å
¥å°ä¸»çªå£ä¸
Container con = getContentPane();
con.setBackground(Color.white);
con.setLayout(null);
con.add(weekLabel);
con.add(dateLabel);
con.add(remarkLabel);
con.add(timeLabel);
con.add(clockLabel);
}
public static void main(String[] args)
{
Clock clock = new Clock();
clock.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
clock.setVisible(true);
}
// èªå®ä¹æ¶éæ ç¾ï¼ç»ä¸ä¸ªåå½¢çæ¶é
class ClockLabel extends JLabel implements Runnable
{
// æ¶éæ ç¾ç宽度åé«åº¦
private final int WIDTH = 500;
private final int HEIGHT = 440;
// åå½¢æ¶éçXåå¾åYåå¾
private final int CIRCLE_X_RADIUS = 150;
private final int CIRCLE_Y_RADIUS = 155;
// åå½¢æ¶éçåç¹
private final int CIRCLE_X = 250;
private final int CIRCLE_Y = 200;
// åå½¢æ¶éæéçé¿åº¦
private final int HOUR_LENGTH = 50;
private final int MIN_LENGTH = 80;
private final int SEC_LENGTH = 100;
// å½åæ¶éæå¤çè§åº¦
double arcHour = 0;
// å½ååéæå¤çè§åº¦
double arcMin = 0;
// å½åç§éæå¤çè§åº¦
double arcSec = 0;
// é¢è²çéæ度ï¼
// å½é¢è²çalphaå¼ä¸º1æè
255æ¶ï¼è¡¨ç¤ºä¸éæï¼å
¶ä»å¼æ¶éæ
int alpha = 50;
// æ è¯é¢è²éæ度ååçæ¹åï¼
// 为trueæ¶è¡¨ç¤ºè¶æ¥è¶éæï¼ä¸ºfalseæ¶è¡¨ç¤ºææ¥è¶ä¸éæ
boolean flag = false;
// èæ¯å¾ççidï¼è½®æ¢æ¾ç¤ºèæ¯å¾çæ¶ä½¿ç¨
int imageID = 0;
// èæ¯å¾ç对象æ°ç»
Image img[] = new Image[5];
// èæ¯å¾çURL
URL url[] = new URL[] { ClockLabel.class.getResource("image/1.jpg"), ClockLabel.class.getResource("image/2.jpg"), ClockLabel.class.getResource("image/3.jpg"), ClockLabel.class.getResource("image/4.jpg"), ClockLabel.class.getResource("image/5.jpg"), ClockLabel.class.getResource("image/6.jpg") };
// ä¸ä¸ªå
·æç¼å²åºçå¾å对象
BufferedImage bufferedImage = null;
int imageSize = 2 * Math.max(CIRCLE_X_RADIUS, CIRCLE_Y_RADIUS);
// 为bufferedImageå建çGraphics对象ï¼ç¨äºå¨bufferedImageä¸ç»å¾
Graphics bufferedImageGraphics = null;
// æ¶é线ç¨ï¼å 为æ¶éæ¯ç§éé½è¦å¨ä¸æ¬¡ï¼æ以ç¨çº¿ç¨
Thread clockThread = null;
// æé æ¹æ³
public ClockLabel()
{
// 设置æ¶éæ ç¾ç大å°
this.setSize(WIDTH, HEIGHT);
// è·åæ¶éãåéãç§éå½åçè§åº¦
arcHour = now.get(Calendar.HOUR) * 30; // ä¸æ ¼30度
arcMin = now.get(Calendar.MINUTE) * 6; // ä¸æ ¼6度
arcSec = now.get(Calendar.SECOND) * 6; // ä¸ä¸ª6度
// æ ¹æ®å¾çURLå建å¾ç对象
Toolkit tk = this.getToolkit();
img[0] = tk.createImage(url[0]);
img[1] = tk.createImage(url[1]);
img[2] = tk.createImage(url[2]);
img[3] = tk.createImage(url[3]);
img[4] = tk.createImage(url[4]);
try
{
// 使ç¨MediaTrackerå è½½å¾ç对象
// MediaTracker ç±»æ¯ä¸ä¸ªè·è¸ªå¤ç§åªä½å¯¹è±¡ç¶æçå®ç¨å·¥å
·ç±»,
// åªä½å¯¹è±¡å¯ä»¥å
æ¬é³é¢åªè¾åå¾åï¼ä½ç®åä»
æ¯æå¾å.
MediaTracker mt = new MediaTracker(this);
mt.addImage(img[0], 0);
mt.addImage(img[1], 0);
mt.addImage(img[2], 0);
mt.addImage(img[3], 0);
mt.addImage(img[4], 0);
// å è½½åªä½è·è¸ªå¨ä¸ææçå¾åã
mt.waitForAll();
}
catch (Exception e)
{
e.printStackTrace();
}
// å建ä¸ä¸ªæç¼å²çImage对象
bufferedImage = new BufferedImage(imageSize, imageSize, BufferedImage.TYPE_INT_ARGB);
// 为BufferedImageå建Graphics2D对象ï¼
// 以åç¨è¯¥Graphics2D对象ç»çå¾é½ä¼ç»å¨BufferedImageä¸
bufferedImageGraphics = bufferedImage.createGraphics();
// å¯å¨çº¿ç¨
clockThread = new Thread(this);
clockThread.start();
}
public void paint(Graphics g1)
{
// Graphics2D继æ¿Graphicsï¼æ¯Graphicsæä¾æ´ä¸°å¯çæ¹æ³
Graphics2D g = (Graphics2D) g1;
/** ***ç»åå½¢æ¶éçå»åº¦ï¼æ¯6度便æä¸ä¸ªå»åº¦**** */
for (int i = 0; i < 360; i = i + 6)
{
// 设置ç»ç¬çé¢è²ä¸ºèè²
g.setColor(Color.blue);
// 设置ç»ç¬ç宽度为2
g.setStroke(new BasicStroke(2));
if (i % 90 == 0)
{
// 对äº0ï¼3ï¼6ï¼9ç¹ä½ç½®ï¼ä½¿ç¨ä¸ä¸ªå¤§çèè²å»åº¦
g.setStroke(new BasicStroke(5));// ç»ç¬å®½åº¦ä¸º5
// å½èµ·ç¹åç»ç¹ä¸æ ·æ¶ï¼ç»çå°±æ¯ç¹
g.drawLine(CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS), CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));
}
else if (i % 30 == 0)
{
// å¦æè§åº¦å¤äºå°æ¶çä½ç½®ï¼èä¸è¿ä¸å¨0ï¼3ï¼6ï¼9ç¹æ¶ï¼ç»çº¢è²çå°å»åº¦
g.setColor(Color.red);
g.drawLine(CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS), CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));
}
else
{
// å
¶ä»ä½ç½®å°±ç»èè²çå°å»åº¦
g.drawLine(CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS), CIRCLE_X + (int) (Math.cos(i * Math.PI / 180) * CIRCLE_X_RADIUS), CIRCLE_Y + (int) (Math.sin(i * Math.PI / 180) * CIRCLE_Y_RADIUS));
}
}
/** ****** ç»æ¶éçæé ******** */
// ç»æ¶é
Line2D.Double lh = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X + Math.cos((arcHour - 90) * Math.PI / 180) * HOUR_LENGTH, CIRCLE_Y + Math.sin((arcHour - 90) * Math.PI / 180) * HOUR_LENGTH);
// 设置ç»ç¬å®½åº¦åé¢è²
g.setStroke(new BasicStroke(6));
g.setColor(new Color(0, 128, 0));
// å©ç¨Graphics2Dçdrawæ¹æ³ç»çº¿
g.draw(lh);
// ç»åé
Line2D.Double lm = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X + Math.cos((arcMin - 90) * Math.PI / 180) * MIN_LENGTH, CIRCLE_Y + Math.sin((arcMin - 90) * Math.PI / 180) * MIN_LENGTH);
g.setStroke(new BasicStroke(3));
g.setColor(new Color(0, 128, 192));
g.draw(lm);
// ç»ç§é
Line2D.Double ls = new Line2D.Double(CIRCLE_X, CIRCLE_Y, CIRCLE_X + Math.cos((arcSec - 90) * Math.PI / 180) * SEC_LENGTH, CIRCLE_Y + Math.sin((arcSec - 90) * Math.PI / 180) * SEC_LENGTH);
g.setStroke(new BasicStroke(1));
// ç§éçé¢è²éæºï¼ä½¿å¨ç»ææææ¾ã
g.setColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255), (int) (Math.random() * 255)));
g.draw(ls);
/** **** ç»æ¶éèæ¯ï¼å¹¶å°å
¶éæå¤ç ******* */
// ææ使ç¨bufferedImageGraphicsç»çå¾åï¼é½ç»å¨bufferedImageä¸ï¼
// drawImageæ¹æ³çåæ°å«ä¹åå«æ¯ï¼èæ¯å¾ç对象ãç®æ ä½ç½®ç¬¬ä¸ä¸ªè§çXãYåæ ãç®æ ä½ç½®ç¬¬äºä¸ªè§çXãYåæ ã
// æºä½ç½®ç¬¬ä¸ä¸ªè§çXãYåæ ãæºä½ç½®ç¬¬äºä¸ªè§çXãYåæ ãå¾å对象æ¹åæ¶çéç¥æ¥åè
bufferedImageGraphics.drawImage(img[imageID], 0, 0, imageSize, imageSize, 0, 0, imageSize + 10, imageSize + 10, this);
// å°èæ¯å¾çéæå
for (int j = 0; j < imageSize; j++)
{
for (int i = 0; i < imageSize; i++)
{
// è·å¾èæ¯å¾åä¸(i, j)åæ çé¢è²å¼
int pix = bufferedImage.getRGB(i, j);
Color c = new Color(pix);
int r = c.getRed();
int gr = c.getGreen();
int b = c.getBlue();
// éè¿Color对象çalphaï¼ä½¿é¢è²éæã
int newpix = new Color(r, gr, b, alpha).getRGB();
// éæ°è®¾ç½®èæ¯å¾åè¯¥è±¡ç´ ç¹çé¢è²
bufferedImage.setRGB(i, j, newpix);
}
}
/** 以ä¸ç»èæ¯æä½é½æ¯ç»å¨bufferedImageä¸çï¼è¿éè¦å°bufferedImageç»å¨ClockLabel **/
// å°å½åç¨æ·åªè´´åº Clip ä¸æ¤ååºåç¸äº¤ï¼å¹¶å° Clip 设置为æå¾ç交é
g.clip(new Ellipse2D.Double(95, 45, imageSize, imageSize));
g.setColor(Color.white);
// å¨ç¨æ·åªè´´åºç»bufferedImage
g.drawImage(bufferedImage, 95, 45, this);
}
public void run()
{
try
{
//
while (clockThread != null)
{
// è·å¾å®æ´çæ¥ææ ¼å¼
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
// æ ¼å¼åå½åæ¶é´
String s = df.format(new Date());
timeLabel.setText(s);
// æ¯å¨ä¸æ¬¡å¯¹æ¶éæéçè§åº¦è¿è¡è°æ´
arcSec += 6;
arcMin += 0.1;
arcHour += 0.1 / 60;
// å½è§åº¦æ»¡ä¸åæ¶ï¼å½0
if (arcSec >= 360)
{
arcSec = 0;
}
if (arcMin >= 360)
{
arcMin = 0;
}
if (arcHour >= 360)
{
arcHour = 0;
}
// å®ç°èæ¯éæ度æ¸å
// ä»æµ
å
¥æ·±ï¼åç±æ·±å
¥æµ
ã
if (flag)
{
alpha += 10;
if (alpha == 50)
{
flag = !flag;
}
}
else
{
alpha -= 10;
if (alpha == 0)
{
flag = !flag;
// å½éæ度ååä¸ä¸ªè½®åæ¶ï¼æ¢ä¸å¼ èæ¯å¾
imageID++;
if (imageID == 4)
{
imageID = 0;
}
}
}
// éç»æ¶éæ ç¾
repaint();
// çå¾
1ç§é
Thread.sleep(1000);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
温馨提示:答案为网友推荐,仅供参考