突然想写个时钟程序,然后如题
然后弱弱的想问一下,大家以前都怎么学习的?俺感觉好迷茫,觉得基础都学了,但是要用起来却又没思路
就算有点思路,却又觉得麻烦,那种感觉就像是 别人用一个循环就解决的问题,俺还在一个个的来算
然后弱弱的想问一下,大家以前都怎么学习的?俺感觉好迷茫,觉得基础都学了,但是要用起来却又没思路
就算有点思路,却又觉得麻烦,那种感觉就像是 别人用一个循环就解决的问题,俺还在一个个的来算
解决方案 »
- JAVA的paint()函数
- 请教有关于同步锁执行顺序!
- 怎么用NetBeans写桌面数据库程序的登录窗口(内详)
- 在Unix上用Runtime执行一个SH脚本的问题
- java 如何实现程序的自动更新,有例子最好了
- 现在比较好一点的日志记录包有哪些?
- struts 问题Cannot find ActionMappings or ActionFormBeans collection
- 在WINDOWS XP是不是不能编译JAVA程序呀?
- 在Java中如何对Oracle数据库的BFILE字段进行存与取?能否给个例子?
- 众们大侠,有熟悉Rogers Cadenhead这个人的吗,介绍一二!
- java 使用JNative 调用 dll 问题~ 在线等
- 是否能用instanceof来判断通过反射机制获取到的Field,如果可以怎么判断呢
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.Calendar;public class ClockBoard extends JComponent {
private final int BORDER_WIDTH = 5;
private final int MARKER_WIDTH = 10;
private int width = 200;
private Calendar calendar;
private Point2D center;
public ClockBoard(int width){
this.width = width;
this.calendar = Calendar.getInstance();
center = new Point2D.Double(width/2+BORDER_WIDTH,width/2+BORDER_WIDTH);
setPreferredSize(new Dimension(width+BORDER_WIDTH*2,width+BORDER_WIDTH*2));
} public void tick(){
calendar.add(Calendar.SECOND,1);
repaint();
} @Override public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,RenderingHints.VALUE_COLOR_RENDER_QUALITY); paintBoard(g2d);
paintHourPointer(g2d);
paintMinutePointer(g2d);
paintSecondPointer(g2d);
} private void paintBoard(Graphics2D g2d){
g2d.setPaint(Color.GREEN.darker().darker());
g2d.setStroke(new BasicStroke(2));
g2d.draw(new Ellipse2D.Double(5,5,width,width)); // circle
g2d.setPaint(Color.GREEN.darker().darker());
g2d.fill(new Ellipse2D.Double(width/2,5,MARKER_WIDTH,MARKER_WIDTH)); // 12
g2d.fill(new Ellipse2D.Double(5,width/2,MARKER_WIDTH,MARKER_WIDTH)); // 9
g2d.fill(new Ellipse2D.Double(width-5,width/2,MARKER_WIDTH,MARKER_WIDTH)); // 3
g2d.fill(new Ellipse2D.Double(width/2,width-5,MARKER_WIDTH,MARKER_WIDTH)); // 6
g2d.draw(new Ellipse2D.Double(width/2,width/2,MARKER_WIDTH,MARKER_WIDTH)); // center
Point2D p1 = new Point2D.Double(width/2+BORDER_WIDTH,BORDER_WIDTH);
Point2D p2 = new Point2D.Double(width/2+BORDER_WIDTH,BORDER_WIDTH + MARKER_WIDTH/2);
AffineTransform t1 = AffineTransform.getRotateInstance(Math.PI/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t1.transform(p1,null),t1.transform(p2,null))); // 1
AffineTransform t2 = AffineTransform.getRotateInstance(Math.PI/3,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t2.transform(p1,null),t2.transform(p2,null))); // 2
AffineTransform t3 = AffineTransform.getRotateInstance(Math.PI*2/3,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t3.transform(p1,null),t3.transform(p2,null))); // 4
AffineTransform t4 = AffineTransform.getRotateInstance(Math.PI*5/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t4.transform(p1,null),t4.transform(p2,null))); // 5
AffineTransform t5 = AffineTransform.getRotateInstance(Math.PI*7/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t5.transform(p1,null),t5.transform(p2,null))); // 7
AffineTransform t6 = AffineTransform.getRotateInstance(Math.PI*8/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t6.transform(p1,null),t6.transform(p2,null))); // 8
AffineTransform t7 = AffineTransform.getRotateInstance(Math.PI*10/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t7.transform(p1,null),t7.transform(p2,null))); // 10
AffineTransform t8 = AffineTransform.getRotateInstance(Math.PI*11/6,center.getX(),center.getY());
g2d.draw(new Line2D.Double(t8.transform(p1,null),t8.transform(p2,null))); // 11
} private void paintHourPointer(Graphics2D g2d){
final int H_LENGTH = 50;
Point2D hourPoint = new Point2D.Double(width/2+BORDER_WIDTH,width/2- H_LENGTH);
double theta = Math.PI*2 * (calendar.get(Calendar.HOUR)*3600 + calendar.get(Calendar.MINUTE)*60 + calendar.get(Calendar.SECOND))/(12*3600);
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D hourLine = new Line2D.Double(center,transform.transform(hourPoint,null));
g2d.setStroke(new BasicStroke(4));
g2d.setPaint(Color.BLUE);
g2d.draw(hourLine);
} private void paintMinutePointer(Graphics2D g2d){
final int M_LENGTH = 70;
Point2D minutePoint = new Point2D.Double(width/2+BORDER_WIDTH, width/2-M_LENGTH);
double theta = Math.PI * 2 * (calendar.get(Calendar.MINUTE)*60 + calendar.get(Calendar.SECOND))/3600 ;
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D minuteLine = new Line2D.Double(center,transform.transform(minutePoint,null));
g2d.setStroke(new BasicStroke(3));
g2d.setPaint(Color.BLACK);
g2d.draw(minuteLine);
} private void paintSecondPointer(Graphics2D g2d){
final int S_LENGTH = 80;
Point2D secondPoint = new Point2D.Double(width/2+BORDER_WIDTH,width/2-S_LENGTH);
double theta = Math.PI * 2 * calendar.get(Calendar.SECOND)/60;
AffineTransform transform = AffineTransform.getRotateInstance(theta,center.getX(),center.getY());
Line2D secondLine = new Line2D.Double(center,transform.transform(secondPoint,null));
g2d.setStroke(new BasicStroke(2));
g2d.setPaint(Color.RED);
g2d.draw(secondLine);
} public static void main(final String[] args) {
java.awt.EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new JFrame("Clock");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
final ClockBoard board = new ClockBoard(200);
board.setBorder(BorderFactory.createEmptyBorder(15,15,15,15));
frame.getContentPane().add(board);
Timer timer = new Timer(1000,new ActionListener(){
public void actionPerformed(ActionEvent e){
board.tick();
}
}); frame.pack();
frame.setVisible(true);
timer.start();
}
});
}
}