Визуализация изображений 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;
}
}
Некоторые предложения для вас:
- Вы можете загрузить изображения в начале приложения, используя многопоточность. Используйте класс Executors для этого. Важно: вы должны загрузить все изображения, прежде чем показывать свой пользовательский интерфейс.
- Другая возможность - асинхронная загрузка изображений. Используйте SwingWorker для загрузки изображений. Загрузка должна быть реализована в методе
doInBackground()
, Когда некоторые изображения загружены, вы можете использовать методыpublish()
/process()
обновить модель стола новыми изображениями. - Вы можете комбинировать оба и использовать
Executors
вdoInBackground()
метод.
Я думаю, ваша проблема не в загрузке процессора. Ваша проблема в IO. Чтение с жесткого диска очень медленное и должно выполняться в фоновом режиме, когда это возможно.