JTable图像渲染在应用程序中占用太多负载

时间:2014-09-04 07:07:41

标签: java swing jtable image-rendering

我正在研究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;
    }
}

2 个答案:

答案 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)

一些建议:

  1. 您可以使用多线程在应用程序开始时加载图像。使用班级Executors来执行此操作。重要的是:您必须在显示UI之前加载所有图像。
  2. 另一种可能性是图像的异步加载。使用SwingWorker加载图片。加载必须在方法doInBackground()中实现。加载某些图片后,您可以使用方法publish() / process()使用新图片更新您的表格模型。
  3. 您可以将两者结合使用,并在Executors方法中使用doInBackground()
  4. 我认为,你的问题不是CPU负载。你的问题是IO。从硬盘读取速度非常慢,应尽可能在后台执行。