【问题标题】:Painting App's background in background thread? [duplicate]在后台线程中绘制应用程序的背景? [复制]
【发布时间】:2014-03-28 02:45:41
【问题描述】:

我有一个从 URL 设置背景的窗口(公共类 Panel 扩展 JPanel)

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    try
    {
        this.imgBG = ImageIO.read(new URL("http://myhost.com/bg.png"));
    }
    catch (Exception e)
    {
        System.out.println("[ERROR] Could not load custom background image! Using resources.");
        this.imgBG = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/Resources/bg.png"));
    }
    g.drawImage(imgBG, 0, 0, this);
}

如果它不会加载图像,那么它将使用资源中的一个。 问题是那些图像在内存中很重并且加载它们是滞后整个窗口。 有没有办法在后台线程中绘制 BG? 如果没有,这是一个好的解决方案吗:

  1. 使用分层面板
  2. 创建具有窗口大小的 JLabel 并将其置于背景中
  3. 创建新的 Runnable 线程来获取图像和 JLabel.setIcon(image)

【问题讨论】:

  • 如果您每次调用paintComponent 时都加载图像,我认为您会遇到严重的滞后 或性能问题。 特别是如果图像是从网络加载的。一般来说,从后台线程绘画不是一个好主意。除非您尝试进行主动渲染,否则您应该将绘画留给 Event-Dispatch 线程。在任何情况下,如果可能,请在进行任何绘画之前加载图像。
  • 使用SwingWorker,见here
  • 谢谢,有用的东西。

标签: java swing


【解决方案1】:

一般来说,您永远不应该使用任何绘制方法加载资源。在您的应用程序的生命周期中,将多次调用 Paint 方法。

尝试使用SwingWorker 在后台加载图像并在完成后更新面板

您可以在程序开始时加载图像作为程序加载过程的一部分,例如....

【讨论】:

  • 此 URL 图像不断被网络上的 php 脚本更改。我的应用程序必须每隔几秒钟更新一次。我设法通过 SwingWorker 做到了这一点,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多