Jpanel有多个图像 - 内存使用

时间:2010-07-14 11:23:46

标签: java swing memory-management

前段时间我提出了关于在JFrame中放置多个图像的以下问题: Can I create a JFrame with multiple images?。 问题是:当我移动滚动条查看图像时,我发现它消耗了大量内存(整个帧的每个滚动滚动大约1mb)。当使用相同的JFrame多次更新(在我的情况下大约100次)时,它就成了一个问题。

所以,我需要一个帮助来防止使用 JFrames 来消耗大量内存。

我尝试使用框架执行相同的屏幕,但它根本不起作用。 感谢。

PS:实施的代码相对简单(它是在Netbeans中制作的)并基于另一个问题的正确答案:

注意,painelJPanel的子类,并以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();
}

1 个答案:

答案 0 :(得分:0)

不需要重新粉刷和更新所有UI。我建议使用JLabel来显示图像而不是JPanel:

  1. 使用Vertical BoxLayout创建一个JPanel(根据需要选择任何其他布局)
  2. 为每张图片添加任意数量的标签。
  3. 将面板添加到滚动窗格。
  4. 设置滚动窗格的首选大小并将其添加到框架中。
  5. 打包框架并显示它。
  6. 这里你不需要做更多的事情。

    还有一条建议...... make sure it is all done on EDT

    如果您希望我在此处提供一些示例代码,请与我们联系。