刷新文本/JLabel 值
Refresh Text / JLabel value
我是初学者,正在寻求更有经验的程序员的一些建议。
我有两个解决方案可以在 GUI 中显示当前 date/time 并像实时时钟一样刷新它。
解决方案 1
**DateFormat** dateFormat = new SimpleDateFormat("dd MMMM yyyy - HH:mm:ss z");
JLabel dateTimeLabel = new JLabel();
add(dateTimeLabel, BorderLayout.CENTER);
new Thread() {
public void run() {
while (true) {
Date curEngDate = new Date();
dateTimeLabel.setText(dateFormat.format(curEngDate));
}
}
}.start();
解决方案 2
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Date date = new Date();
label.setText(dateFormat.format(date));
}
});
timer.start();
问题:
据我了解,Timer 会持续 运行,类似于线程。
并且使用事件侦听器可能比使用 while 循环更好。
但是你的经历是怎样的呢?你会怎么做?
- 这些不同的解决方案是否有特定的用例?
- 哪个更符合你的体验?
- 在内存/电源使用方面会更好吗?
- 这些对性能有什么影响?
- 或者有什么更好的解决办法吗?
我正在寻找有关此类功能的一般建议,不一定是时钟或 date/time
提前感谢您的所有建议
区别在于您的代码的线程 运行。
解决方案一创建它自己的线程并从中更新标签。
解决方案 2 使用 awt 计时器 class。它生成自己的线程,但在 AWT-EventQueue 线程上调用 actionPerformed 方法。
由于对组件的所有更改都应该只发生在 AWT-EventQueue 上,因此选择正确的解决方案。
查看有关线程的 swing 教程以获取更多信息。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
到目前为止,定时器是两者中更好的选择,但我建议您改用 SwingWorker。
在性能方面,如果你看一下你写的代码,你会发现定时器只每 3 秒(3000 毫秒)执行一次,而线程会连续 运行 没有延迟到 while 循环,使 Timer 更好,除非你真的需要不断更新标签。
但是,由于您的任务很长 运行ning,您可能应该使用 SwingWorker,因为它对于与 Swing GUI 相关的很长 运行ning 任务很有用。长 运行ning 任务往往会锁定 GUI,这显然不好。 SwingWorker 能够在执行您的任务时保持 GUI 响应。 这里是Oracle提供的教程
Which is the more suitable one to your experience?
这完全取决于你想做什么。通常使用计时器来制作动画或 运行 具有特定延迟的东西就足够了。但是,如果您这样做,EDT(事件调度线程)中的所有内容 运行s。但是,如果您执行一个包含大量计算和图像渲染的复杂程序,它可能会减慢您的渲染速度(并且您的 JFrame 可能会变白),因为 EDT 中的所有内容 运行。
或者,您可以实现自己的程序循环(或游戏循环)——这是您的解决方案 1。但是编写一个好的循环并不是那么简单。它会 运行 尽可能快地浪费 CPU 周期。
然后您将不得不调用 Thread.sleep() 来生成线程(暂停您的线程,以便其他线程可以 运行)。您还必须自己控制帧速率。无论如何,记住不要在美国东部时间 运行 Thread.sleep()
。
除非您打算做一些复杂的事情,否则最简单的方法仍然是使用 Java 的摆动计时器。
Will either be better in terms of memory / power usage?
这并不重要。
What impact will these have on performance?
在性能方面,运行我认为单独的线程似乎更好。但它在给定的 2 解决方案中并没有真正的区别,除非你正在做一个相对较大的项目。
Or is there any better solution?
如果您想自己在 Java 中编码,通常有两种解决方案。如果没有,您可以使用一些外部包。
我是初学者,正在寻求更有经验的程序员的一些建议。
我有两个解决方案可以在 GUI 中显示当前 date/time 并像实时时钟一样刷新它。
解决方案 1
**DateFormat** dateFormat = new SimpleDateFormat("dd MMMM yyyy - HH:mm:ss z");
JLabel dateTimeLabel = new JLabel();
add(dateTimeLabel, BorderLayout.CENTER);
new Thread() {
public void run() {
while (true) {
Date curEngDate = new Date();
dateTimeLabel.setText(dateFormat.format(curEngDate));
}
}
}.start();
解决方案 2
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Date date = new Date();
label.setText(dateFormat.format(date));
}
});
timer.start();
问题:
据我了解,Timer 会持续 运行,类似于线程。 并且使用事件侦听器可能比使用 while 循环更好。
但是你的经历是怎样的呢?你会怎么做?
- 这些不同的解决方案是否有特定的用例?
- 哪个更符合你的体验?
- 在内存/电源使用方面会更好吗?
- 这些对性能有什么影响?
- 或者有什么更好的解决办法吗?
我正在寻找有关此类功能的一般建议,不一定是时钟或 date/time
提前感谢您的所有建议
区别在于您的代码的线程 运行。 解决方案一创建它自己的线程并从中更新标签。
解决方案 2 使用 awt 计时器 class。它生成自己的线程,但在 AWT-EventQueue 线程上调用 actionPerformed 方法。
由于对组件的所有更改都应该只发生在 AWT-EventQueue 上,因此选择正确的解决方案。
查看有关线程的 swing 教程以获取更多信息。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
到目前为止,定时器是两者中更好的选择,但我建议您改用 SwingWorker。
在性能方面,如果你看一下你写的代码,你会发现定时器只每 3 秒(3000 毫秒)执行一次,而线程会连续 运行 没有延迟到 while 循环,使 Timer 更好,除非你真的需要不断更新标签。
但是,由于您的任务很长 运行ning,您可能应该使用 SwingWorker,因为它对于与 Swing GUI 相关的很长 运行ning 任务很有用。长 运行ning 任务往往会锁定 GUI,这显然不好。 SwingWorker 能够在执行您的任务时保持 GUI 响应。 这里是Oracle提供的教程
Which is the more suitable one to your experience?
这完全取决于你想做什么。通常使用计时器来制作动画或 运行 具有特定延迟的东西就足够了。但是,如果您这样做,EDT(事件调度线程)中的所有内容 运行s。但是,如果您执行一个包含大量计算和图像渲染的复杂程序,它可能会减慢您的渲染速度(并且您的 JFrame 可能会变白),因为 EDT 中的所有内容 运行。
或者,您可以实现自己的程序循环(或游戏循环)——这是您的解决方案 1。但是编写一个好的循环并不是那么简单。它会 运行 尽可能快地浪费 CPU 周期。
然后您将不得不调用 Thread.sleep() 来生成线程(暂停您的线程,以便其他线程可以 运行)。您还必须自己控制帧速率。无论如何,记住不要在美国东部时间 运行 Thread.sleep()
。
除非您打算做一些复杂的事情,否则最简单的方法仍然是使用 Java 的摆动计时器。
Will either be better in terms of memory / power usage?
这并不重要。
What impact will these have on performance?
在性能方面,运行我认为单独的线程似乎更好。但它在给定的 2 解决方案中并没有真正的区别,除非你正在做一个相对较大的项目。
Or is there any better solution?
如果您想自己在 Java 中编码,通常有两种解决方案。如果没有,您可以使用一些外部包。