Jpanel с несколькими изображениями - использование памяти - PullRequest
1 голос
/ 14 июля 2010

Некоторое время назад я задал следующий вопрос о размещении нескольких изображений в JFrame: Можно ли создать JFrame с несколькими изображениями? . Проблема в том, что: когда я перемещаю полосу прокрутки, чтобы увидеть изображения, я обнаружил, что она потребляет много памяти (около 1 МБ на каждый ролик прокрутки для всего кадра). Когда работа с одним и тем же JFrame возобновляется много раз (в моем случае около 100 раз), это становится проблемой.

Итак, мне нужна помощь для предотвращения высокого потребления памяти с помощью JFrames .

Я пытался сделать тот же экран, используя Frame , но он не работал вообще. Спасибо.

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

1 Ответ

0 голосов
/ 15 июля 2010

Нет необходимости в перерисовке и обновлении пользовательского интерфейса.Я бы предложил использовать JLabel для показа изображений вместо JPanel:

  1. Создайте один JPanel с Vertical BoxLayout (выберите любой другой макет при необходимости)
  2. Добавьте столько меток к нему для каждогоimage.
  3. Добавление панели на панель прокрутки.
  4. Установка предпочтительного размера панели прокрутки и добавление его к кадру.
  5. упаковка кадра и отображение.

Больше здесь ничего не нужно делать.

Еще один совет ... make sure it is all done on EDT.

Дайте мне знать, если вы хотите, чтобы я добавил сюда пример кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...