使用Java设置具有初始时间的模拟时钟

时间:2016-05-06 01:22:40

标签: java swing clock

对于我的编程课程,我正在研究一个时钟。时钟必须在初始时间设置,我无法弄清楚该怎么做。我正在使用的时钟只使用系统时间。我已经尝试使用cal.set设置时间但是它只是冻结了我想要的初始时间和时间没有进展。如何编辑它以允许我设置初始时间,但时钟仍然有效?     包时钟;

package Clock;

import java.applet.Applet;
import java.awt.Color;
import java.lang.Object;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class Component extends Applet implements Runnable {
private static final long serialVersionUID = 1L;

public static String name = "My Clock";

public static int size = 600;

public static boolean isRunning = false;

public static Graphics g;

public static Image screen;

public Numbers number;

public static JFrame frame;

public static void main(String [] args) {
    Component component = new Component();

    frame = new JFrame();
    frame.add(component);
    frame.setSize(size+6, size + 28);
    frame.setTitle(name);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

    component.start();
}

public void start() {
    requestFocus();

    number = new Numbers();

    isRunning = true;
    Thread th = new Thread(this);
    th.start();
}

public void run() {
    screen = createVolatileImage(size, size);
    while (isRunning) {
        tick();
        render(g);
        try {
            Thread.sleep(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public void tick() {

}

public double time;
public int anim;
public int anim2;
public int anim3;
public int anim4;
public int center = size/2;
public int radius = (size-40)/2;

public void render(Graphics g) {
    // Drawing to image

    screen = createImage(size, size);
    g = screen.getGraphics();

    //Drawing the background

    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(0, 0, size, size);

    // Drawing the frame(outside circle)

    g.setColor(Color.black);
    g.fillOval(5, 5, size - 10, size - 10);
    g.setColor(Color.white);
    //g.setColor(new Color(new Random().nextInt(255). new Random().nextInt(255), new Random().nextInt(255)));
    //g.drawOval(10, 10, size - 20, size - 20);
    g.fillOval(20, 20, size - 40, size - 40);

    number.render(g);

    // Math and Drawing for Lines

    for (int i =  0; i < 60; i++) {
        radius = size - 40;
        anim = center + (int) ((Math.sin(i % 60.0 / 60 * Math.PI * 2) * (radius / 2)));
        anim2 = center - (int) ((Math.cos(i % 60.0 / 60 * Math.PI * 2) * (radius / 2)));
        radius = size - 60;
        anim3 = center + (int) ((Math.sin(i % 60.0 / 60 * Math.PI * 2) * (radius / 2)));
        anim4 = center - (int) ((Math.cos(i % 60.0 / 60 * Math.PI * 2) * (radius / 2)));
        g.drawLine(anim, anim2, anim3, anim4);
    }

    // Math for hour hand

    radius = size - 140;
    // time = System.currentTimeMillis() % 3600000 / 3600000 * Math.PI;
    int t = (int) (System.currentTimeMillis() + 17300000) + 3600000+ 3600000 + 3600000 + 3600000 + 3600000 + 3600000 + 3600000 + 3600000;
    anim = center
            + (int) ((Math.sin(t % 43200000.0
                    / 43200000 * Math.PI * 2) * (radius / 2))) + 7;
    anim2 = center
            - (int) ((Math.cos(t % 43200000.0
                    / 43200000 * Math.PI * 2) * (radius / 2))) + 7;

    // Drawing the hour hand

    g.setColor(Color.black);
    g.fillOval(center - 8, center - 8, 16, 16);
    g.drawLine(center, center, anim, anim2);
    g.drawLine(center + 1, center, anim + 1, anim2);
    g.drawLine(center, center + 1, anim, anim2 + 1);
    g.drawLine(center - 1, center, anim - 1, anim2);
    g.drawLine(center, center - 1, anim, anim2 - 1);
    g.drawLine(center + 1, center + 1, anim, anim2);
    g.drawLine(center + 1, center - 1, anim, anim2);
    g.drawLine(center - 1, center + 1, anim, anim2);
    g.drawLine(center - 1, center - 1, anim, anim2);


    // Math for minute hand

    radius = size - 90;
    // time = System.currentTimeMillis() % 3600000 / 3600000 * Math.PI;
    anim = center
            + (int) ((Math.sin(System.currentTimeMillis() % 3600000.0
                    / 3600000 * Math.PI * 2) * radius / 2));
    anim2 = center
            - (int) ((Math.cos(System.currentTimeMillis() % 3600000.0
                    / 3600000 * Math.PI * 2) * radius / 2));

    // Drawing the minute hand
    g.setColor(Color.black);
    g.drawLine(center, center, anim, anim2);
    g.drawLine(center + 1, center, anim + 1, anim2);
    g.drawLine(center, center + 1, anim, anim2 + 1);
    g.drawLine(center - 1, center, anim - 1, anim2);
    g.drawLine(center, center - 1, anim, anim2 - 1);

    //Math for second hand

    DateFormat dateFormat = new SimpleDateFormat("ss");
    Calendar cal = Calendar.getInstance();
    String s = dateFormat.format(cal.getTime());

    radius = size - 70;
    // time = System.currentTimeMillis() % 60000 / 60000 * Math.PI;
    anim = center
            + (int) ((Math.sin(Integer.parseInt(s) % 60.0 / 60 * Math.PI
                    * 2) * (radius / 2)));
    anim2 = center
            - (int) ((Math.cos(Integer.parseInt(s) % 60.0 / 60 * Math.PI
                    * 2) * (radius / 2)));

    // Drawing the second hand

    g.setColor(Color.red);
    g.drawLine(center, center, anim, anim2);
    g.drawLine(center + 1, center, anim + 1, anim2);
    g.drawLine(center, center + 1, anim, anim2 + 1);
    g.drawLine(center - 1, center, anim - 1, anim2);
    g.drawLine(center, center - 1, anim, anim2 - 1);

    // Center circle

    g.fillOval(center - 5, center - 5, 10, 10);
    g.setColor(Color.black);
    g.fillOval(center - 2, center - 2, 4, 4);

    // g.setColor(new Color(new Random().nextInt(255), new Random().nextInt(255), new Random().nextInt(255)));
    // g.fillRect(0, 0, getWidth(), getHeight());

    // Drawing to screen

    g = getGraphics();
    g.drawImage(screen, 0, 0, size, size, this);
    g.dispose();
}

}

package Clock;

import java.applet.Applet;
import java.awt.Color;
import java.lang.Object;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Numbers extends JPanel {
    private static final long serialVersionUID=1L;

    public int size = Component.size;
    public int center = size/2;

    public void setFont(Font font) {
     super.setFont(font);
     repaint();
    }
    public String getDay() {
        DateFormat dateFormat=new SimpleDateFormat("dd");
        Calendar cal = Calendar.getInstance();
        String s = dateFormat.format(cal.getTime());
        int day = Integer.parseInt(s);
        String d = day + "";
            // sets ordinal indicator
            switch(day) {
                   case 1:
                   case 21:
                   case 31:
                   d += "st";
                   break;
                   case 2:
                   case 22:
                   d += "nd";
                   break;
                   case 3:
                   case 23:
                   d += "rd";
                   break;
                   default:
                   d += "th";
            }
            return d;
    }
  public String getHour() {
      DateFormat dateFormat = new SimpleDateFormat("HH");
      Calendar cal = Calendar.getInstance();
      String s = dateFormat.format(cal.getTime());
      int hour = Integer.parseInt(s) -1;

      String n = hour + "";
      if(hour < 10) {
          n=hour+"";
      }
      return n;
  }

  public String getMonth() {
      DateFormat dateFormat = new SimpleDateFormat("MM");
      Calendar cal = Calendar.getInstance();
      String s = dateFormat.format(cal.getTime());
      int month = Integer.parseInt(s);

      // sets month name to number
      String m = "";
      switch (month)
      {
          case 1:
            m= "January";
            break;
          case 2:
            m= "February";
            break;
          case 3:
            m= "March";
            break;
          case 4:
            m= "April";
            break;
          case 5:
            m= "May";
            break;
          case 6:
            m= "June";
            break;
          case 7:
            m= "July";
            break;
          case 8:
            m= "August";
            break;
          case 9:
            m= "September";
            break;
          case 10:
            m= "October";
            break;
          case 11:
            m= "November";
            break;
          case 12:
            m= "December";
      }
      return m;
  }

  public void render(Graphics g) {
      g.setColor(Color.black);

      DateFormat dateFormat = new SimpleDateFormat(":mm:ss");
      Calendar cal = Calendar.getInstance();
      String s = dateFormat.format(cal.getTime());
      int n = center - ((s.length() *13)/2);
      //265
      g.setFont(new Font("Arial", 1, 20));
      s = (Integer.parseInt(getHour(), 10) % 12 + 1) + "" + dateFormat.format(cal.getTime());
      n = center - (s.length() * 10 / 2);
      g.setColor(Color.DARK_GRAY);
      g.fillRoundRect(250, 348, 100, 30, 6, 6);
      g.setColor(Color.LIGHT_GRAY);
      g.fillRoundRect(252, 350, 96, 26, 6, 6);
      g.setColor(Color.BLACK);
      g.drawString("TIME", 275, 345);
      g.drawString("DATE", 275, 225);
      g.drawString("AM", 255, 150);
      g.drawString("PM", 315, 150);
      g.drawString(s, n, 370);
      int p = Integer.parseInt(getHour(), 10);
      if(p < 11 || p == 24) {
          g.fillOval(265, 160, 10, 10);
          g.drawOval(325, 160, 10, 10);
      } else {
          g.drawOval(265, 160, 10, 10);
          g.fillOval(325, 160, 10, 10);
      }

      dateFormat = new SimpleDateFormat("yyyy");
      cal = Calendar.getInstance();
      s = getMonth() + " " + getDay() + ", " + dateFormat.format(cal.getTime());
      n = center - (int) ((s.length() * 10.25) / 2);

      g.setColor(Color.DARK_GRAY);
      g.fillRoundRect(200, 228, 200, 30, 6, 6);
      g.setColor(Color.LIGHT_GRAY);
      g.fillRoundRect(202, 230, 196, 26, 6, 6);
      g.setColor(Color.BLACK);
      g.drawString(s, n, 250);
      s = Component.name;
      n=center - (int)((s.length()*10)/2);
      g.drawString(s, n , 450);

      g.setFont(new Font("Arial", 1, 30));
      int radius = size - 100;
      for(int i = 0; i < 12; i++) {
          double anim = (int) ((Math.sin((i+1) % 12.0 / 12 * Math.PI * 2) * (radius / 2)));
          double anim2 = (int) ((Math.cos((i+1) % 12.0 / 12 * Math.PI * 2) * (radius / 2)));
          if(i >= 9){
              anim -= 10;
          }
          g.drawString((i+1) + "", center + (int) anim - 6, center - (int) anim2 + 12);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

很多问题 - 从哪里开始?

  • 您已经命名了一个类Component,这个名称很容易引起与Java核心GUI类java.awt.Component的冲突。将其重命名为其他内容。
  • 这个类扩展了Applet,但没有被用作Applet。相反,它被用作要添加到JFrame的组件 - 这没有意义,尝试将一个顶级窗口添加到另一个顶层窗口,并且需要一些理由来说明为什么要在这样的情况下执行此操作奇怪的魅力。为什么不将JPanel或JComponent扩展为更有意义的其他内容呢?
  • 你正在使用Graphics字段并绘制它,这会冒NullPointerException的风险。取而代之的是谷歌并阅读Swing绘图教程并按照他们的指导 - 在JPanel的paintComponent方法中被动地绘制。还有其他重要的细节可以帮助您了解教程将显示和告诉您的内容。
  • 您正在使用通过在组件上调用getGraphics()获得的Graphics对象进行绘制,这将导致不稳定的绘图和可能的NullPointerExceptions。再次阅读有关如何正确执行此操作的教程。
  • 您正在后台线程中进行Swing调用,这可能导致间歇性难以调试线程错误。使用Swing Timer让自己更轻松。谷歌关于血腥细节的教程。
  • 您似乎正在创建一个JPanel,Numbers,但是没有将它添加到GUI(我可以告诉),而是试图以一种奇怪的方式呈现它 - 为什么,我不知道。不要这样做。再按照Swing绘图教程做图形。这是链接:
  • .....更多