突然想写个时钟程序,然后如题
然后弱弱的想问一下,大家以前都怎么学习的?俺感觉好迷茫,觉得基础都学了,但是要用起来却又没思路
就算有点思路,却又觉得麻烦,那种感觉就像是 别人用一个循环就解决的问题,俺还在一个个的来算

解决方案 »

  1.   

    一个简陋的例子:
    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();
    }
        });
        }
    }
      

  2.   

    如果是划线的话还是很好画得,如果指针式图片的话,可以在google搜索Java2D 图片旋转