前段时间我提出了关于在JFrame中放置多个图像的以下问题: Can I create a JFrame with multiple images?。 问题是:当我移动滚动条查看图像时,我发现它消耗了大量内存(整个帧的每个滚动滚动大约1mb)。当使用相同的JFrame多次更新(在我的情况下大约100次)时,它就成了一个问题。
所以,我需要一个帮助来防止使用 JFrames 来消耗大量内存。
我尝试使用框架执行相同的屏幕,但它根本不起作用。 感谢。
PS:实施的代码相对简单(它是在Netbeans中制作的)并基于另一个问题的正确答案:
注意,painel
是JPanel
的子类,并以JPanel
绘制图像。
ArrayList<painel> panels;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
/** Creates new form Frame */
public Frame() {
initComponents();
panels = new ArrayList<painel>();
this.setLocationRelativeTo(null);
}
// Load the images in the panel
public void loadImages(ArrayList<String> names) {
jPanel1.removeAll();
jScrollPane1.getVerticalScrollBar().setValue(0);
panels.clear();
for (String name : names) {
panels.add(new painel(name));
}
for (painel p : panels) {
jPanel1.add(p);
p.repaint();
}
jPanel1.updateUI();
}
// Generated By NetBeans
@SuppressWarnings("unchecked")
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jPanel1 = new javax.swing.JPanel();
jPanel1.setMinimumSize(new java.awt.Dimension(500, 7000));
jPanel1.setPreferredSize(new java.awt.Dimension(500, 7000));
jPanel1.setLayout(new javax.swing.BoxLayout(
jPanel1, javax.swing.BoxLayout.Y_AXIS));
jScrollPane1.setViewportView(jPanel1);
jScrollPane1.getVerticalScrollBar().setUnitIncrement(50);
javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 581, Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(
javax.swing.GroupLayout.Alignment.LEADING).addComponent(
jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE));
pack();
}
答案 0 :(得分:0)
不需要重新粉刷和更新所有UI。我建议使用JLabel来显示图像而不是JPanel:
这里你不需要做更多的事情。
还有一条建议...... make sure it is all done on EDT
。
如果您希望我在此处提供一些示例代码,请与我们联系。