繁体   English   中英

Memory 在缩放图像作为背景时泄漏 java swing

[英]Memory leak while scaling image as background in java swing

所以,我正在尝试编写一个 function 来缩放图像并将其用作背景,但它分配了很多 memory 并且几秒钟后引发了 out of memory 异常。 这是无限循环内的 function。

public static void scale() {
        JLabel background = new JLabel();
        Image imgscale = img.getScaledInstance(back.getWidth(), back.getHeight(), Image.SCALE_SMOOTH);
        ImageIcon backgroundImage = new ImageIcon(imgscale);
        background.setIcon(backgroundImage);
        background.setSize(back.getWidth(), back.getHeight());
        jlayeredpane1.add(background, Integer.valueOf(0));
        jlayeredpane1.remove(background);
        frame.setVisible(true);
    }

无限循环内的 function。

等等,什么??

public static void scale() {
    JLabel background = new JLabel();
    Image imgscale = img.getScaledInstance(back.getWidth(), back.getHeight(), Image.SCALE_SMOOTH);
    ImageIcon backgroundImage = new ImageIcon(imgscale);
    background.setIcon(backgroundImage);
    background.setSize(back.getWidth(), back.getHeight());
    jlayeredpane1.add(background, Integer.valueOf(0));
    jlayeredpane1.remove(background);
    frame.setVisible(true);
}

想一想,每次调用此方法时,您都是...

  • 创建JLabel的新实例( background
  • 创建一个新的img实例,按比例缩小
  • 创建一个新的ImageIcon实例来环绕Image
  • ImageIcon应用于JLabel
  • 将刚刚创建的JLabel实例添加到JLayeredPane
  • JLayeredPane中删除您刚刚创建的JLabel实例……等等,什么?

您想知道为什么 memory 用完了吗?! 我什至没有提到这是在static上下文中完成的。

添加,如果您在事件调度线程的上下文中执行此操作,您将导致 UI“冻结”,如果您不在事件调度线程的上下文中执行此操作,那么您再次违反 API,因为 Swing 不是线程安全的。

我建议看看类似...

关于如何实现目标的一些更好的想法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM