Java 带有渲染器的Jtable中未显示图像

Java 带有渲染器的Jtable中未显示图像,java,swing,jtable,imageicon,tablecellrenderer,Java,Swing,Jtable,Imageicon,Tablecellrenderer,我已经为我的表创建了CellRenderer。 如果图像尺寸较小,则效果良好。 但是,如果它有点大,它会显示空白 public class ImageRenderer extends DefaultTableCellRenderer { JLabel lbl = new JLabel(); JButton bouton ; List<Commentaire> liste; ImageIcon icon ; Commentaire commentaire;

我已经为我的表创建了CellRenderer。 如果图像尺寸较小,则效果良好。 但是,如果它有点大,它会显示空白

 public  class ImageRenderer extends DefaultTableCellRenderer {
 JLabel lbl = new JLabel();
 JButton bouton ;

List<Commentaire> liste;
  ImageIcon icon ;
  Commentaire commentaire;


   // Increase the height of each row by 50% so we can see the whole
   // image.

    public ImageRenderer() {
         liste=  new CommentaireDAO().findCommentaire();
    }

@Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {

 if (column==0){
     int id = (int)value;
     Client c = new ClientDAO().findClientById(id);
     InputStream photo= c.getPhoto();
     try {
            if (photo != null) {
                int size = photo.available();
                byte[] imageBytes = new byte[size];
                photo.read(imageBytes);
                ImageIcon icon = new ImageIcon(imageBytes);
                Image img = icon.getImage();
                BufferedImage bi = new BufferedImage(img.getWidth(null),img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
                Graphics g = bi.createGraphics();
                g.drawImage(img, 0, 0, 50, 50, null);
                ImageIcon newIcon = new ImageIcon(bi);
                lbl.setSize(250,250);
                lbl.setHorizontalAlignment(CENTER);
                lbl.setIcon(newIcon);
            }else{
                System.out.println("photo null");
            }
        } catch (IOException ex) {
            Logger.getLogger(OffreClientGUI.class.getName()).log(Level.SEVERE, null, ex);
        }

      }
公共类ImageRenderer扩展了DefaultTableCellRenderer{
JLabel lbl=新的JLabel();
布顿;
列表列表;
图像图标;
评论评论;
//将每行的高度增加50%,这样我们就可以看到整个场景
//形象。
公共图像渲染器(){
liste=new CommentaireDAO().findCommentaire();
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔值、,
布尔值(焦点、整数行、整数列){
如果(列==0){
int id=(int)值;
客户端c=new ClientDAO().findClientById(id);
InputStream photo=c.getPhoto();
试一试{
如果(照片!=null){
int size=photo.available();
字节[]图像字节=新字节[大小];
照片读取(imageBytes);
ImageIcon图标=新的ImageIcon(imageBytes);
Image img=icon.getImage();
BuffereImage bi=新的BuffereImage(img.getWidth(null)、img.getHeight(null)、BuffereImage.TYPE\u INT\u ARGB);
Graphics g=bi.createGraphics();
g、 drawImage(img,0,0,50,50,null);
ImageIcon newIcon=新的ImageIcon(bi);
lbl.设置尺寸(250250);
lbl.设置水平对齐(中心);
lbl.setIcon(newIcon);
}否则{
System.out.println(“照片为空”);
}
}捕获(IOEX异常){
Logger.getLogger(OffreClientGUI.class.getName()).log(Level.SEVERE,null,ex);
}
}

是否有任何方法可以调整图像大小以适合列?

渲染器中的代码应该非常快速高效。您不应该在每次渲染单元格时都进行创建图像的处理

相反,您应该在TableModel中存储一个ImageIcon。然后您重写TableModel的
getColumnClass(…)
方法以返回
Icon.class
,JTable将使用图标的默认表呈现器

如果要动态缩放图标,可以在TableModel中添加一个图标。

查看如何调整图像大小。我不确定正确渲染的大小。可能需要使用它