JTable Image Render正在应用程序中承担过多的负载 [英] JTable Image render is Taking too much load In Application

查看:95
本文介绍了JTable Image Render正在应用程序中承担过多的负载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发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;
    }
}

I am working on Java the Application of Swing and which i am getting Data and i am using swing Jtable Render for render Image in that but when data is more its hanging all time so what can i do to prevent that?

example render that i am using.

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

解决方案

This...

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

Is an expensive call, each time it's called, a new ImageIcon class is created which is wrapping around the BufferedImage data been read. Unlike ImageIcon, ImageIO will not buffer images and re-use them, instead, it will read the resource a new.

This means, that each time the cell is rendered, the image is been fully reloaded.

Since, your loading the same image each time, simple load the image when you construct the class and make use of it when needed, for example...

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

这篇关于JTable Image Render正在应用程序中承担过多的负载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆