Визуализация изображений JTable слишком загружена в приложении

Я работаю над Java-приложением Swing и для которого я получаю данные, и я использую Swing Jtable Render для рендеринга изображений, но когда данные все время зависают, что я могу сделать, чтобы предотвратить это?

Пример рендера, который я использую.

public class DefaultTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {

    JLabel jLabel;

    public DefaultTableCellRenderer() {
        jLabel = new JLabel();

    }

    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean selected, boolean focus, int row, int col) {

        try {
            if (row == 1) {
                jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));
                jLabel.setText("Image Data");
                jLabel.setBackground(Color.LIGHT_GRAY);
            } else {
                jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));
                jLabel.setText("Final");
            }

            //jLabel.setIcon(new ImageIcon(ImageIO.read(new File("blank"))));

            return jLabel;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return jLabel;
    }

    @Override
    public boolean mouseEnter(Event evt, int x, int y) {
        System.out.println(jLabel.getText());
        return true;
    }
}

2 ответа

Это...

jLabel.setIcon(new ImageIcon(ImageIO.read(getClass().getResource("blank.png"))));

Это дорогой звонок, каждый раз, когда он называется, новый ImageIcon класс создан, который оборачивается вокруг BufferedImage данные были прочитаны. В отличие от ImageIcon, ImageIO не будет буферизовать изображения и повторно использовать их, вместо этого он будет считывать ресурс новым.

Это означает, что каждый раз при визуализации ячейки изображение полностью перезагружается.

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

public class DefaultTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {

    private Icon icon;

    public DefaultTableCellRenderer() throws IOException {
        icon = new ImageIcon(ImageIO.read(getClass().getResource("blank.png");
    }

    public Component getTableCellRendererComponent(
            JTable table, Object value, boolean selected, boolean focus, int row, int col) {
        super.getTableCellRendererComponent(table, value, selected, focus, row, col);
        setIcon(icon);
        if (row == 1) {
            setText("Image Data");
            setBackground(Color.LIGHT_GRAY); // You may need to set the opaque state for this to work...
        } else {
            setText("Final");
        }
        return this;
    }
}

Некоторые предложения для вас:

  1. Вы можете загрузить изображения в начале приложения, используя многопоточность. Используйте класс Executors для этого. Важно: вы должны загрузить все изображения, прежде чем показывать свой пользовательский интерфейс.
  2. Другая возможность - асинхронная загрузка изображений. Используйте SwingWorker для загрузки изображений. Загрузка должна быть реализована в методе doInBackground(), Когда некоторые изображения загружены, вы можете использовать методы publish()/process() обновить модель стола новыми изображениями.
  3. Вы можете комбинировать оба и использовать Executors в doInBackground() метод.

Я думаю, ваша проблема не в загрузке процессора. Ваша проблема в IO. Чтение с жесткого диска очень медленное и должно выполняться в фоновом режиме, когда это возможно.

Другие вопросы по тегам