Java 在背景线程中绘制应用程序的背景?

Java 在背景线程中绘制应用程序的背景?,java,swing,Java,Swing,我有一个窗口公共类面板扩展了JPanel,它从URL设置背景 @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

我有一个窗口公共类面板扩展了JPanel,它从URL设置背景

@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);
}
如果它不加载图像,那么它将使用资源中的图像。 问题是这些图像在内存中很重,加载它们滞后于整个窗口。 有没有一种方法,我可以画背景线背景? 如果不是,这是一个好的解决方案:

使用分层面板 创建具有窗口大小的JLabel并将其放置在背景中 创建新的可运行线程,以获取映像和JLabel.setIconimage
通常,在任何绘制方法中都不应使用加载资源。在应用程序的生命周期中,将多次调用绘制方法

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


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

如果每次调用paintComponent时都加载图像,我认为您会遇到严重的延迟或性能问题。尤其是从网络加载图像时。一般来说,从背景线绘画不是一个好主意。除非尝试进行活动渲染,否则应将绘制留给事件调度线程。在任何情况下,如果可能,在进行任何绘制之前加载图像。使用SwingWorker,请参阅。谢谢,这是一件有用的事情。web上的php脚本会不断更改此URL图像。我的应用程序必须每隔几秒钟更新一次。我通过SwingWorker做到了这一点,谢谢。