我正在为一个项目制作一个数字时钟,我有四个课程:DigitalTimeUI
,这是 JFrame 类,TitlePanel
, DigitPanel
, and ColonPanel
,它们是所述项目的 JPanel。完成后,它应该看起来像这样:
我坚持的部分是添加DigitPanel
s 到 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 个面板。 “数字时间”是一个面板TitlePanel
班级。数字框是DigitPanel
班级有6人。冒号框是ColonPanel
班级里有两个人。我遇到的问题是将时间分成 6 个不同的盒子。就像图片显示“48”一样,我需要一种方法来获取值GregorianCalendar.MINUTE
或者其他什么,然后将其分成 4 和 8 分别放入每个盒子中。谢谢。
如果我正确理解了这个问题......
您正在面向对象的环境中工作。您应该尽可能将您的设计分解为最小的可管理工作单元。
对我来说,这意味着每个数字(或时间单位)是最小的工作单位。这需要一个能够简单地显示 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);
}
}
}
Updated
基本上你可以做类似的事情...
String min = String.valueOf(Calendar.getInstance().get(Calendar.MINUTE));
char[] digits = min.toCharArray();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)