Java - 如何每秒更新一个面板

时间:2013-11-01 13:12:26

标签: java user-interface time clock windowbuilder

我正在尝试创建一个显示当前时间的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);

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

// 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)

6 个答案:

答案 0 :(得分:3)

我发现了解决方案!

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

        // 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

答案 1 :(得分:2)

首先,您使用java.util.Timer代替javax.swing.Timer。在使用Swing组件时,您需要使用第二个类,以确保在Event Dispatch Thread上进行GUI更新。另请查看Concurrency in Swing教程。

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

如果您仍希望每次删除/添加JLabel,请注意以下事项:

来自Container.add() javadoc:

  

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

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

contentPane.remove(lblThetime);
contentPane.add(lblThetime);
contentPane.revalidate();

答案 2 :(得分: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);

答案 3 :(得分: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的新日期

答案 4 :(得分:0)

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        label.setText(new Date().toString());
    }
}, 1000, 1000);

不是更简单吗?

答案 5 :(得分:-2)

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

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

HIH

KL