无法弄清楚如何让我尝试制作数字时钟以保持时间

时间:2013-10-06 18:26:53

标签: java

所以我的作业(惊喜,作业!)是制作一个代表两行数字时钟的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();
        }
    }
}
}

非常感谢任何见解!

3 个答案:

答案 0 :(得分:0)

1)移动所有计算逻辑(IS计算逻辑:获取新的Date实例,格式化等,ISNT计算逻辑:将面板添加到布局,将jframe设置为可见等)到recompute()方法< / p>

2)致电

recompute();
repaint();
在TimerListener中

答案 1 :(得分:0)

您已经有一个重新绘制的计时器,为了绘制新的时间,您需要确保将时间String更新到新的时间。

答案 2 :(得分:0)

我看到它的方式你可以将你的问题分成3个部分。

  1. 显示给定时间的标签

  2. 滚动任何文本的组件(您也可以找到一些选项)。这可能意味着您专门为执行动画位运行一个线程。

  3. 后台线程(确保将其设置为守护程序线程),用于更新上述两个组件的“数据”。

  4. 在后台主题中,传递1&amp;的实例。 2.您似乎已经找到了“睡眠”部分,所以现在您只需要更新实例上的文本数据。

    此外,确保在事件调度线程(EDT)上执行任何数据更新(如果您计划直接更新Swing组件的内容)。

    HTH