2012-10-14 78 views
1

我有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()); 
+0

調試器向您展示什麼? –

+0

@BrianRoach:在這個方法上突出顯示它在一個循環中被調用;還有什麼我應該檢查調試器? – RYN

+8

這幾天似乎是流行:Do.Not.Change.The.Table.In.Renderer。 – kleopatra

回答

12

取下渲染器

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

電話。此調用將調整再次觸發渲染器的行高度

+0

@ 4r1y4n和'Image Scaled'應該是'final local variable',Scaled = tmp.getImage()。getScaledInstance(nw,nh, Image.SCALE_SMOOTH);','tmp = new ImageIcon(Scaled);'同樣的問題,超出'Renderer' – mKorbel