【问题标题】:Updating JPanel/JFrame not working更新 JPanel/JFrame 不起作用
【发布时间】:2026-01-30 13:25:01
【问题描述】:

我有一个创建 JFrame 的类,并且需要在 JFrame 中显示一个图像。图片必须每隔几秒旋转一次。

我已经尝试在 JFrame 和 JPanel 上使用 repaint()、revalidate() 和 validate(),但似乎都没有效果。以下是我当前更新 JFrame/JPanel 的代码。此代码将等待 4 秒,然后显示第四张图片,但我希望它每秒更新一张新图片。

public void startSlideshow(){
int i = 0;
Long oldTime = System.currentTimeMillis();
do {
   Long currentTime = System.currentTimeMillis();
   if( currentTime - oldTime >= 1000 ) {
      img = new JLabel(new ImageIcon("Albums/" + album + "/" + imageNames.get(i)));
      panel.removeAll();
      panel.setBackground(Color.BLACK);
      panel.add(img);
      panel.revalidate();
      panel.repaint();
      i++;          
      oldTime = System.currentTimeMillis();  // reset reference time
}
} while(i<imageNames.size());

panel.removeAll();
panel.setBackground(Color.BLACK);
panel.add(img);
panel.getRootPane().revalidate();
panel.repaint();
}

非常感谢任何帮助,因为我已经有一段时间了。谢谢。

【问题讨论】:

  • 即使这样有效,因为您使用的是忙等待循环,这将是一场灾难。 D:
  • @Boann 这不起作用,在这场灾难之前我已经尝试了大约 10 个不同的版本。谢谢。
  • 你在哪里管理 1 秒的等待?
  • 使用循环等待(即使在专用线程上)效率极低,因为它只会消耗宝贵的 CPU 周期。您最好在此处使用Timer 或在单独的线程中使用sleeping,并通过SwingUtilities 在EDT 上调度绘制请求。

标签: java swing paint carousel


【解决方案1】:

您正在阻塞事件调度线程,阻止它处理新的重绘请求。

不要使用循环和Thread.sleep,而是尝试使用javax.swing.Timer

看看How to Use Swing TimersConcurrency in Swing

您可能还会发现更改JLabel 的图标而不是每次都创建一个新的JLabel 更简单...

【讨论】: