代码之家  ›  专栏  ›  技术社区  ›  marionmaiden

多图像Jpanel-内存使用

  •  1
  • marionmaiden  · 技术社区  · 14 年前

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

    所以,我需要一个帮助来防止使用 JFrames公司 .

    我试着用同样的屏幕 框架 ,但根本不起作用。 谢谢。

    PS:实现的代码相对简单(它是在Netbeans中生成的),并且基于另一个问题的正确答案:

    注意, painel 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 回复  |  直到 8 年前
        1
  •  0
  •   Eugene Ryzhikov    14 年前

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

    1. 创建一个带有垂直BoxLayout的JPanel(根据需要选择任何其他布局)
    2. 为每个图像添加尽可能多的标签。
    3. 将面板添加到滚动窗格。
    4. 设置滚动窗格的首选大小并将其添加到框架中。
    5. 包装好相框并展示出来。

    你在这里不需要再做什么了。

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

    如果你想让我在这里放一些示例代码,请告诉我。