我正在研究Java Swing的应用程序,我正在使用数据,而我正在使用swing Jtable Render for render Image,但是当数据更多时,它会挂起,所以我该怎样做才能防止这种情况?
示例渲染我正在使用。
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;
}
}
答案 0 :(得分:3)
此...
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 :(得分:2)
一些建议:
doInBackground()
中实现。加载某些图片后,您可以使用方法publish()
/ process()
使用新图片更新您的表格模型。Executors
方法中使用doInBackground()
。我认为,你的问题不是CPU负载。你的问题是IO。从硬盘读取速度非常慢,应尽可能在后台执行。