在 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
关于如何实现目标的一些更好的想法
所以, 我正在尝试编写一个函数来缩放图像并将其用作背景,但它分配了大量内存,几秒钟后出现内存不足异常。 这是无限循环内的函数。
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
关于如何实现目标的一些更好的想法