用Java制作数字时钟

我正在为一个项目制作一个数字时钟,我有四个类: DigitalTimeUI ,它是JFrame类, TitlePanelDigitPanelColonPanel ,它们是所述项目的ColonPanel 。 完成后,它应如下所示:

在此处输入图像描述

我坚持的部分是将DigitPanel添加到UI类的框架中。 这就是我现在主要课程中的内容:

 public class DigitalTimeUI extends JFrame { public static GregorianCalendar currentDate; final static int CLOCKWIDTH = 605; final static int CLOCKHEIGHT = 200; public static void main(String[] args) { int numOfDigits = 6; int startingX = 0; int startingY = 0; Font clockFont = new Font("Tahoma", Font.BOLD, 72); JFrame clock = new JFrame(); clock.setSize(CLOCKWIDTH, CLOCKHEIGHT); clock.setVisible(true); clock.setResizable(false); clock.setDefaultCloseOperation(EXIT_ON_CLOSE); TitlePanel titlePanel = new TitlePanel(); JLabel title = new JLabel("DIGITAL CLOCK"); title.setFont(clockFont); title.setForeground(Color.BLACK); titlePanel.add(title); clock.add(titlePanel); DigitPanel digitPanel = new DigitPanel(); JLabel digit; startingY = 115; while (numOfDigits > 0) { if ((numOfDigits % 2) == 0) { startingX += 5; digit = new JLabel(String.valueOf(0)); } } } } 

这个代码现在变得一团糟,在我得到最后一部分后,我还有一些清理工作要做。 这个底部只是我试图显示6位数字段的一些废料。 我认为我遇到的主要问题是找到一种方法来分割从GregorianCalendar返回的时间并将它们放入6个不同的框中,然后使用while循环或诸如此类的方法将它们放入框架中。

澄清一下上面的图片是由教师给我的,作为格式化时钟时的指南。 它还有9个面板。 “DIGITAL TIME”是TitlePanel类的一个面板。 数字框是DigitPanel类,其中有6个。 冒号框是ColonPanel类,有两个。 我遇到的问题是将时间分成6个不同的方框。 就像,图片显示“48”,我需要一种方法从GregorianCalendar.MINUTE或其他任何东西中获取值,并将其分成4和8以放入每个框中。 谢谢。

如果我正确理解了这个问题……

您正在OO环境中工作。 您应该尽可能地将设计分解为最小的可管理工作单元。

对我来说,这意味着每个数字(或时间单位)是最小的工作单位。 这将需要一个只能显示0填充int值的组件。

从那里,你可以建立一个时钟窗格,使用3位数的窗格,如此。

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Calendar; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class DigitalClock { public static void main(String[] args) { new DigitalClock(); } public DigitalClock() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private DigitPane hour; private DigitPane min; private DigitPane second; private JLabel[] seperator; private int tick = 0; public TestPane() { setLayout(new GridBagLayout()); hour = new DigitPane(); min = new DigitPane(); second = new DigitPane(); seperator = new JLabel[]{new JLabel(":"), new JLabel(":")}; add(hour); add(seperator[0]); add(min); add(seperator[1]); add(second); Timer timer = new Timer(500, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Calendar cal = Calendar.getInstance(); hour.setValue(cal.get(Calendar.HOUR_OF_DAY)); min.setValue(cal.get(Calendar.MINUTE)); second.setValue(cal.get(Calendar.SECOND)); if (tick % 2 == 1) { seperator[0].setText(" "); seperator[1].setText(" "); } else { seperator[0].setText(":"); seperator[1].setText(":"); } tick++; } }); timer.setRepeats(true); timer.setCoalesce(true); timer.start(); } } public class DigitPane extends JPanel { private int value; @Override public Dimension getPreferredSize() { FontMetrics fm = getFontMetrics(getFont()); return new Dimension(fm.stringWidth("00"), fm.getHeight()); } public void setValue(int aValue) { if (value != aValue) { int old = value; value = aValue; firePropertyChange("value", old, value); repaint(); } } public int getValue() { return value; } protected String pad(int value) { StringBuilder sb = new StringBuilder(String.valueOf(value)); while (sb.length() < 2) { sb.insert(0, "0"); } return sb.toString(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); String text = pad(getValue()); FontMetrics fm = getFontMetrics(g.getFont()); int x = (getWidth() - fm.stringWidth(text)) / 2; int y = ((getHeight()- fm.getHeight()) / 2) + fm.getAscent(); g.drawString(text, x, y); } } } 

更新

基本上你可以做点什么......

 String min = String.valueOf(Calendar.getInstance().get(Calendar.MINUTE)); char[] digits = min.toCharArray(); 

如此处所示,使用SimpleDateFormat格式化您的时间。 这将为您提供一个格式化的字符串,您可以索引该字符串以获取组件的文本。

此相关示例使用以下格式化程序:

 private static final SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); private final Date now = new Date(); ... String s = df.format(now);