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

Java-如何每秒更新一个面板,java,user-interface,time,clock,windowbuilder,Java,User Interface,Time,Clock,Windowbuilder,我正在尝试创建一个显示当前时间的JavaGUI。目前,我可以让它显示当前时间,但只能在启动时显示。然后它就永远停留在那个时间。原因是我不知道如何让它在每秒新的当前时间自动加载。以下是我迄今为止的相关代码: // Getting the current time... long epoch = System.currentTimeMillis() / 1000; String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new

我正在尝试创建一个显示当前时间的JavaGUI。目前,我可以让它显示当前时间,但只能在启动时显示。然后它就永远停留在那个时间。原因是我不知道如何让它在每秒新的当前时间自动加载。以下是我迄今为止的相关代码:

// 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 stuff xD的一个完完全全的noob)

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

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

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

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

您可以尝试对该任务使用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

您可以尝试使用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。线索1:在Java中真正搜索计时器类。你选对了吗

提示2:改为更新标签文本


KL

线索1:真正在Java中搜索计时器类。你选对了吗

提示2:改为更新标签文本


KL

首先,您使用的是代替。在使用Swing组件时,您需要使用第二个类,以确保在上进行GUI更新。还可以看看教程

正如其他答案中所建议的,无需在每次更新文本时删除/添加
JLabel
。只需调用方法

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

从javadoc:

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

然后需要调用方法。像这样:

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

首先,您使用的是而不是。在使用Swing组件时,您需要使用第二个类,以确保在上进行GUI更新。还可以看看教程

正如其他答案中所建议的,无需在每次更新文本时删除/添加
JLabel
。只需调用方法

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

从javadoc:

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

然后需要调用方法。像这样:

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

我发现了解决办法

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

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

我发现了解决方案

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        label.setText(new Date().toString());
    }
}, 1000, 1000);
我尝试了这里作为答案给出的所有解决方案,没有一个能让代码完全工作,但是所有答案都为我指明了正确的方向。我在一个我已经忘记名字的网站上找到了问题的解决方案,但我利用了它的建议,提出了这个最终解决方案,它起了作用:

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

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        label.setText(new Date().toString());
    }
}, 1000, 1000);
这不是更简单吗


这不是更简单吗?

你好,基利·利亚姆。欢迎来到SO,感谢您的参与,但这不是SO的工作方式。。。在这里,你不应该用谜语和其他问题回答问题,当然也不应该以“RTFM”的方式给出“线索”。在这里,你可以用…回答问题。。。答案!你也不应该以“希望它有帮助”或你的名字缩写来结束你的答案。如果你不知道或者不想给出正确的答案,那么你就不发帖子了。如果你想评论(而不是回答),你可以使用评论(一旦你获得了一些代表)。欢迎来到SO,感谢您的参与,但这不是SO的工作方式。。。在这里,你不应该用谜语和其他问题回答问题,当然也不应该以“RTFM”的方式给出“线索”。在这里,你可以用…回答问题。。。答案!你也不应该以“希望它有帮助”或你的名字缩写来结束你的答案。如果你不知道或者不想给出正确的答案,那么你就不发帖子了。如果你想发表评论(而不是回答),你可以使用评论(一旦你获得了一些声誉)。因为它没有解决问题,它只为我指明了正确的方向。然而,这并不是贬低它,因为它让我找到了上述解决方案,我将其标记为解决了问题。如果我能接受多个答案,我也会接受dic19。你的问题是因为没有使用setText——他明确指出了这一点。我还相信,既然他引导你纠正了代码,他就应该受到惩罚