一遍又一遍地调用getTableCellRendererComponent并使100%的CPU使用率 [英] getTableCellRendererComponent is called over and over and makes 100% CPU usage
问题描述
我有一个JTable
,它的其中一列应显示一张图片;
我重写了DefaultTableCellRenderer
的getTableCellRendererComponent
方法来执行此操作.
但是问题是图像不是不是 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屋!