JTable的图像渲染是服用过多的负载在应用(JTable Image render is Taki

2019-10-20 21:24发布

我工作的Java Swing的应用和我得到的数据,我使用摆动的JTable渲染渲染中的图像,但是当数据更为其挂所有的时间,所以我能做些什么来避免呢?

例如渲染,我使用。

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

Answer 1:

这个...

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

是一种昂贵的调用,每一个新的,它被称为时间ImageIcon创建类,这是围绕包装BufferedImage数据被读取。 不同ImageIconImageIO将不缓存图像,并重新使用它们,相反,它会读取资源的新。

这意味着,每个小区呈现时间,图像被被完全重新加载。

因为,你的每一次加载相同的图像,简单的负载图像,当你构建类并在需要时使用它,例如...

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


Answer 2:

对您的一些建议:

  1. 您可以使用多线程在申请开始加载图像。 使用类执行人做到这一点。 重要的是:你展示你的UI之前必须加载的所有图像。
  2. 另一种可能性是图像的asynchronious加载。 使用SwingWorker类加载图像。 装载必须在方法实现doInBackground() 当一些图像加载,你可以使用的方法publish() / process()来更新新的图像表格模型。
  3. 您可以结合两者并用ExecutorsdoInBackground()方法。

我想,你的问题不是CPU的负荷。 你的问题是IO。 从硬盘读是很慢的,应在后台时有可能被执行。



文章来源: JTable Image render is Taking too much load In Application