所以我的作业(惊喜,作业!)是制作一个代表两行数字时钟的GUI。第一行是时钟本身(hh:mm aa),第二行是日期作为滚动文本(EEEE - MMMM dd,yyyy)。我已经设法让所有这些显示出来,但我无法弄清楚如何用我的计算机时钟来更新我的日期 - 这意味着我在下午1:47运行它,它永远不会变为1:48下午。我一直在阅读,看起来我的问题的答案似乎是使用一个线程并让它try{Thread.sleep(1000)}
或类似的东西,但经过几个小时的实验,我无法想象如何将它应用到我拥有的东西:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
public class InnerClasses extends JFrame {
public InnerClasses() {
this.setLayout(new GridLayout(2, 1));
add(new TimeMessagePanel());
add(new DateMessagePanel());
}
/** Main method */
public static void main(String[] args) {
Test frame = new Test();
frame.setTitle("Clock");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(280, 100);
frame.setVisible(true);
}
static class TimeMessagePanel extends JPanel {
DateFormat timeFormat = new SimpleDateFormat("hh:mm aa");
Date time = new Date();
private String timeOutput = timeFormat.format(time);
private int xCoordinate = 105;
private int yCoordinate = 20;
private Timer timer = new Timer(1000, new TimerListener());
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(timeOutput, xCoordinate, yCoordinate);
}
class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}
}
static class DateMessagePanel extends JPanel {
DateFormat dateFormat = new SimpleDateFormat("EEEE - MMMM dd, yyyy");
Date date = new Date();
private String dateOutput = dateFormat.format(date);
private int xCoordinate = 0;
private int yCoordinate = 20;
private Timer timer = new Timer(250, new TimerListener());
public DateMessagePanel() {
timer.start();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (xCoordinate > getWidth() - 50) {
xCoordinate = -50;
}
xCoordinate += 5;
g.drawString(dateOutput, xCoordinate, yCoordinate);
}
class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
repaint();
}
}
}
}
非常感谢任何见解!
答案 0 :(得分:0)
1)移动所有计算逻辑(IS计算逻辑:获取新的Date实例,格式化等,ISNT计算逻辑:将面板添加到布局,将jframe设置为可见等)到recompute()
方法< / p>
2)致电
recompute();
repaint();
在TimerListener中
答案 1 :(得分:0)
您已经有一个重新绘制的计时器,为了绘制新的时间,您需要确保将时间String
更新到新的时间。
答案 2 :(得分:0)
我看到它的方式你可以将你的问题分成3个部分。
显示给定时间的标签
滚动任何文本的组件(您也可以找到一些选项)。这可能意味着您专门为执行动画位运行一个线程。
后台线程(确保将其设置为守护程序线程),用于更新上述两个组件的“数据”。
在后台主题中,传递1&amp;的实例。 2.您似乎已经找到了“睡眠”部分,所以现在您只需要更新实例上的文本数据。
此外,确保在事件调度线程(EDT)上执行任何数据更新(如果您计划直接更新Swing组件的内容)。
HTH