1

我正在尝试创建一个显示当前时间的 Java GUI。目前,我可以让它显示当前时间,但只能在启动时显示。然后它就永远停留在那个时间。原因是我无法弄清楚如何让它每秒自动加载到新的当前时间。到目前为止,这是我的相关代码:

// Getting the current time...
long epoch = System.currentTimeMillis() / 1000;
String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(epoch * 1000));

// Creating the panel...
JLabel lblThetime = new JLabel(date);
sl_panel.putConstraint(SpringLayout.NORTH, lblThetime, 55, SpringLayout.SOUTH, lblIBeA);
sl_panel.putConstraint(SpringLayout.WEST, lblThetime, 139, SpringLayout.WEST, panel);
lblThetime.setFont(new Font("Avenir Next", Font.PLAIN, 40));

// Adding the time to the panel
panel.add(lblThetime);

// My refresher which doesn't work
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        removeAll();
        validate();
        repaint();
    }
}, 1000, 1000);

我试图使用来自该线程的信息进行复习,但无济于事,窗口(运行时)只是空白。然后我尝试使用来自这个线程的信息进行不同的复习,并创建了这个:

// My refresher which doesn't work
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        contentPane.remove(lblThetime);
        contentPane.add(lblThetime);
    }
}, 1000, 1000);

随着contentPane被定义为private JPanel contentPane;

这也不起作用,但是只有时间本身是空白的,窗口中的其余内容(另一个 JLabel(只是一些文本))保持正常。

没有任何刷新,它的行为如上所述,它只显示它开始的时间并永远保持在那个时间。

我将 Eclipse 与 WindowBuilder 一起使用。(而且我(可能很明显)是 Java GUI 的完全菜鸟 xD)

4

6 回答 6

4

我发现了解决方案!

我在这里尝试了所有作为答案给出的解决方案,但没有一个可以使代码完全正常工作,但是所有答案都为我指明了正确的方向。我在一个我忘记了名字的网站上找到了问题的解决方案,但我使用了它的建议并提出了这个有效的最终解决方案:

        // New timer which works!
    int delay = 1000; //milliseconds
      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(System.currentTimeMillis()));
              lblThetime.setText(date);
          }
      };
      new Timer(delay, taskPerformer).start();

感谢所有没有说答案的人,我可能无法找到这个解决方案:D

于 2013-11-02T12:05:51.297 回答
2

首先,您使用的是java.util.Timer而不是javax.swing.Timer。在使用 Swing 组件时,您需要使用第二个类,以确保在Event Dispatch Thread上进行 GUI 更新。还可以查看Swing 中的并发教程。

JLabel正如其他答案中所建议的,每次您想要更新其文本时都无需删除/添加。只需调用JLabel.setText()方法。

如果您仍然希望JLabel每次都删除/添加,请注意这一点:

Container.add() javadoc:

此方法更改与布局相关的信息,因此使组件层次结构无效。如果容器已显示,则必须随后验证层次结构以显示添加的组件。

然后你需要调用Component.revalidate()方法。像这样:

contentPane.remove(lblThetime);
contentPane.add(lblThetime);
contentPane.revalidate();
于 2013-11-01T13:31:00.807 回答
0

您应该每秒更改标签的字符串,而不是删除标签并将其添加到面板。

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
       String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date() );

       lblThetime.setText(date);
    }
}, 1000, 1000);



// Creating the panel...
JLabel lblThetime = new JLabel(date);
于 2013-11-01T13:17:24.073 回答
0

您可以尝试将 Swing Timer 用于该任务,例如:

private static JLabel l;

public static void main(String[] args) {

    Timer timer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            l.setText(new Date().toString());
        }
    });
    timer.start(); 
    JFrame f = new JFrame();
    l=new JLabel(new Date().toString());
    f.getContentPane().add(l);

    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}

该示例每秒使用新日期更新 JLabel

于 2013-11-01T13:17:36.370 回答
0
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        label.setText(new Date().toString());
    }
}, 1000, 1000);

不是更简单吗?

于 2014-08-23T17:30:19.103 回答
-2

线索 1:真正在 Java 中搜索 Timer 类。你选对了吗?

线索 2:改为更新标签文本。

HIH

吉隆坡

于 2013-11-01T13:18:59.440 回答