Java-如何每秒更新一个面板
我正在尝试创建一个显示当前时间的JavaGUI。目前,我可以让它显示当前时间,但只能在启动时显示。然后它就永远停留在那个时间。原因是我不知道如何让它在每秒新的当前时间自动加载。以下是我迄今为止的相关代码: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
// 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——他明确指出了这一点。我还相信,既然他引导你纠正了代码,他就应该受到惩罚