在 java swing 中将图像缩放为背景时发生内存泄漏

Memory leak while scaling image as background in java swing

所以, 我正在尝试编写一个函数来缩放图像并将其用作背景,但它分配了大量内存,几秒钟后出现内存不足异常。 这是无限循环内的函数。

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);
    }

the function that is inside an infinite loop.

等等,什么!?

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 的实例...等等,什么!?

而且您想知道为什么 运行 内存不足?!我什至没有提到这是在 static 上下文中完成的事实。

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

我建议看一下类似...

  • Scale the ImageIcon automatically to label size
  • Resizing icon to fit on JButton in Java?
  • How to set a background picture in JPanel

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