我有JTable
,其中一列應顯示圖像; 爲了做到這一點,我重寫了getTableCellRendererComponent
方法DefaultTableCellRenderer
。 但問題是,雖然圖像是而不是Null
&單元格顯示它,這種方法是通過調用&(就像它被稱爲無限循環)並使用100%的CPU! (當圖像是Null
沒有問題!)。getTableCellRendererComponent反覆調用並使CPU使用率達到100%
什麼問題?
我的擴展類是:
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());
調試器向您展示什麼? –
@BrianRoach:在這個方法上突出顯示它在一個循環中被調用;還有什麼我應該檢查調試器? – RYN
這幾天似乎是流行:Do.Not.Change.The.Table.In.Renderer。 – kleopatra