هذا مثال على ما يمكن القيام به باستعمال Java2D، وهو ساعة بسيطة، النتيجة هي على هذا الشكل
هذه هي الفئة الرئيسية التي يتم فيها الرسم
package clock;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RadialGradientPaint;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.util.Calendar;
import javax.swing.JPanel;
import javax.swing.Timer;
public class ClockPanel extends JPanel implements ActionListener {
private final int WIDTH = 200, HEIGHT = 200, ANGLE_INCREMENT_HOUR = 30,
ANGLE_INCREMENT_MINUTE = 6, ANGLE_INCREMENT_SECOND = 6,
RADIUS = 80, X_CENTER = WIDTH/2, Y_CENTER = HEIGHT/2,
RADIUS_HOUR = 40, RADIUS_MINUTE = 60, RADIUS_SECOND = 60;
private Timer timer;
private Line2D hourLine, minuteLine, secondLine;
private BufferedImage bgImage;
public ClockPanel() {
timer = new Timer(1000, this);
hourLine = new Line2D.Float(X_CENTER, Y_CENTER, 0, 0);
minuteLine = new Line2D.Float(X_CENTER, Y_CENTER, 0, 0);
secondLine = new Line2D.Float(X_CENTER, Y_CENTER, 0, 0);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
timer.start();
}
public void actionPerformed(ActionEvent e) {
repaint();
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
if (bgImage == null) {
bgImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D gImage = bgImage.createGraphics();
gImage.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
paintClockBackground(gImage);
paintClockBorder(gImage);
paintClockMarks(gImage);
}
g.drawImage(bgImage, 0, 0, this);
paintClockPointers(g);
paintDigitalClock(g);
}
private void paintClockMarks(Graphics g) {
g.setColor(Color.RED);
for (int i = 0; i < 60; i++) {
double angle = Math.toRadians(i * ANGLE_INCREMENT_SECOND);
int x = (int)(X_CENTER + (RADIUS - 3) * Math.cos(angle));
int y = (int)(Y_CENTER + (RADIUS - 3) * Math.sin(angle));
if (i % 5 == 0){
g.fillOval(x, y, 2, 2);
} else {
g.fillOval(x, y, 1, 1);
}
}
}
private void paintClockPointers(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.RED);
Calendar now = Calendar.getInstance();
//paint hour pointer
int hour = now.get(Calendar.HOUR);
double angleHour = Math.toRadians(hour * ANGLE_INCREMENT_HOUR);
int xHour = (int)(X_CENTER + RADIUS_HOUR * Math.cos(angleHour - 1.5708)); //1.5708 radian = 90 degree
int yHour = (int)(Y_CENTER + RADIUS_HOUR * Math.sin(angleHour - 1.5708));
hourLine.setLine(X_CENTER, Y_CENTER, xHour, yHour);
g2.setStroke(new BasicStroke(6f, BasicStroke.JOIN_MITER, BasicStroke.CAP_ROUND));
g2.draw(hourLine);
//paint minute pointer
int minute = now.get(Calendar.MINUTE);
double angleMinute = Math.toRadians(minute * ANGLE_INCREMENT_MINUTE);
int xMinute = (int)(X_CENTER + RADIUS_MINUTE * Math.cos(angleMinute - 1.5708));
int yMinute = (int)(Y_CENTER + RADIUS_MINUTE * Math.sin(angleMinute - 1.5708));
minuteLine.setLine(X_CENTER, Y_CENTER, xMinute, yMinute);
g2.setStroke(new BasicStroke(3f, BasicStroke.JOIN_MITER, BasicStroke.CAP_ROUND));
g2.draw(minuteLine);
//paint second pointer
int second = now.get(Calendar.SECOND);
double angleSecond = Math.toRadians(second * ANGLE_INCREMENT_SECOND);
int xSecond = (int)(X_CENTER + RADIUS_SECOND * Math.cos(angleSecond - 1.5708));
int ySecond = (int)(Y_CENTER + RADIUS_SECOND * Math.sin(angleSecond - 1.5708));
secondLine.setLine(X_CENTER, Y_CENTER, xSecond, ySecond);
g2.setStroke(new BasicStroke());
g2.draw(secondLine);
}
private void paintClockBackground(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
RadialGradientPaint gradient = new RadialGradientPaint(X_CENTER - 30, Y_CENTER - 30, RADIUS,
new float[]{0.0f, 1.0f}, new Color[]{Color.decode("0x4E65AF"), Color.decode("0x0000")});
g2.setPaint(gradient);
g2.setStroke(new BasicStroke(10.0f));
g2.fillOval(20, 20, RADIUS*2, RADIUS*2);
}
private void paintClockBorder(Graphics g) {
GradientPaint gradient = new GradientPaint(0, 0, Color.decode("0x4E65AF"), WIDTH, HEIGHT, Color.decode("0x1D316A"));
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(gradient);
g2.setStroke(new BasicStroke(5.0f));
g2.drawOval(18, 18, RADIUS*2 + 2, RADIUS*2 + 2);
}
private void paintDigitalClock(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.WHITE);
Calendar now = Calendar.getInstance();
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
String strTime = (hour<10 ? "0"+ hour : hour) + ":" + (minute<10 ? "0"+ minute : minute) + ":" + (second<10 ? "0"+ second : second);
int widthString = g.getFontMetrics().stringWidth(strTime);
g.drawString(strTime, X_CENTER - widthString/2, Y_CENTER + RADIUS/2);
}
}المشروع في المرفقات
