java - JTable 图像渲染在应用程序中承受过多负载

标签 java swing jtable image-rendering

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

最佳答案

这...

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

关于java - JTable 图像渲染在应用程序中承受过多负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25659273/

相关文章:

java - 无法连续搜索

java - 抽象类中的静态方法

java - EJML获取矩阵特征向量的实值

java - Jtable swing获取行数据

java - GridLayout + 鼠标监听器

java - 当字符被屏蔽时,jtextarea 会暂时显示字符,而这是不应该的

java - 将 jTable 选择导出到 Excel 并打开 Excel

java - 使用 gradle 从 java 项目中删除未使用的导入

java - Eclipse 集成开发环境设置

java - 在 Jtable 单元格中的复选框旁边插入文本