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