一遍又一遍地调用getTableCellRendererComponent并使100%的CPU使用率 [英] getTableCellRendererComponent is called over and over and makes 100% CPU usage

查看:359
本文介绍了一遍又一遍地调用getTableCellRendererComponent并使100%的CPU使用率的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个JTable,它的其中一列应显示一张图片; 我重写了DefaultTableCellRenderergetTableCellRendererComponent方法来执行此操作. 但是问题是图像不是不是 Null&单元格正在显示它,此方法称为over&结束(例如在无限循环中调用),并使用100%的CPU! (当图像为Null时,没有问题!).

I have a JTable and one of its columns should display an image; I overrided getTableCellRendererComponent method of DefaultTableCellRenderer to do this. But the problem is while the image is not Null & cell is displaying it this method is called over & over (like it is called in an infinite loop) and uses 100% of CPU! (When the image is Null there is no problem!).

出什么问题了?

我的延伸班级是:

public class imageCellRenderer extends DefaultTableCellRenderer{

    @Override
    public void validate() {}
    @Override
    public void revalidate() {}
    @Override
    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
    @Override
    public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if(isSelected) {
            this.setBackground(table.getSelectionBackground());
            this.setForeground(table.getSelectionForeground());
        }else {
            this.setBackground(table.getBackground());
            this.setForeground(table.getForeground());
        }
        this.setIcon(null);
        Image Scaled;
        ImageIcon tmp;
        System.out.println("CR");
        if(value != null){
            System.out.println("CRP");
            if(value instanceof ImageIcon){
                tmp=(ImageIcon)value;
            }else{
                tmp=new ImageIcon(value.toString());
            }
            int w=tmp.getIconWidth();
            int h=tmp.getIconHeight();
            int refW=100;
            int refH=100;
            double ratio=(double)w/(double)h;
            if(w!=refW && h!=refH){
                int nh,nw;
                double relx=(double)w/(double)refW;
                if(((double)h/relx)<refH){
                    nh = (int) Math.round(refW / ratio);
                    nw = refW;
                }else{
                    nw=(int)Math.round(refH*ratio);
                    nh=refH;
                }
                Scaled=tmp.getImage().getScaledInstance(nw, nh, Image.SCALE_SMOOTH);

                tmp=new ImageIcon(Scaled);
            }
            this.setIcon(tmp);
            table.setRowHeight(row, tmp.getIconHeight());

            this.setSize(100, tmp.getIconHeight());
            this.setHorizontalAlignment(JLabel.CENTER);
        }
        return this;
    }

}

我这样使用它:

jTable1.getColumnModel().getColumn(2).setCellRenderer(new imageCellRenderer());

推荐答案

删除

table.setRowHeight(row, tmp.getIconHeight());

来自渲染器的

调用.该调用将调整行高,从而再次触发渲染器

call from the renderer. This call will adjust the row height which triggers the renderer again

这篇关于一遍又一遍地调用getTableCellRendererComponent并使100%的CPU使用率的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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