2014-02-25 23 views
1

我有一个窗口(公共类面板扩展JPanel)是从URL在后台线程中绘制App的背景?

@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. 使用采用LayeredPanel
  2. 与窗口的大小创建一个JLabel并将其放置在背景
  3. 结交新运行的线程,将获得的图像和JLabel.setIcon(图像)
+1

我认为如果每次调用paintComponent时都会加载图像,那么您会遇到严重的* lag *或性能问题。 *特别是*如果图像是从网络加载的。一般而言,从后台线程绘画并不是一个好主意。您应该将绘画留给事件派发线程,除非您正在尝试*主动渲染*。无论如何,如果可能的话,在做任何绘画之前加载图像。 – afsantos

+0

使用'SwingWorker',见[这里](http://stackoverflow.com/q/4530428/230513)。 – trashgod

+0

谢谢,有用的东西。 – Ernio

回答

0

通常,您不应该使用任何绘画方法加载资源。在应用程序的生命周期中,绘制方法将被多次调用。

尝试使用当它完成

您可以加载在节目开始时的图像作为程序加载过程的一部分,例如SwingWorker加载图像的背景和更新面板...

+0

这个URL图片不断被网页上的php脚本改变。我的应用必须每隔几秒更新一次。我设法通过SwingWorker做到这一点,谢谢。 – Ernio