首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载大量缓冲映像会大大降低程序的速度( java )。

加载大量缓冲映像会大大降低程序的速度( java )。
EN

Stack Overflow用户
提问于 2022-07-22 20:36:30
回答 3查看 51关注 0票数 0

我正在为一个JTable设置一个自定义的单元格渲染器,它必须包含一个相册封面图像,即来自另一个库的byte[],问题是转换到BufferedImage的速度太慢了,在早期版本的代码中,程序甚至不会启动。现在情况好了,但滞后还是很明显的。以下是代码:

代码语言:javascript
复制
public class ImageCellRenderer extends DefaultTableCellRenderer {
   
   JLabel lbl = new JLabel();
   
   public Image[] getAlbumart() throws IOException {

      Image[] albumArt = new Image[allmymusic.size()];
          
      for (int i = 0; i < allmymusic.size(); i++) {
         byte[] data = allmymusic.get(i).albumImageData;
         ImageIO.setUseCache(false);
             
         if(allmymusic.get(i).albumImageData != null){

            BufferedImage bImage;                
            try(ByteArrayInputStream bis = new ByteArrayInputStream(data)) {
               bImage = ImageIO.read(bis);
            }            
            ImageIcon icon = new ImageIcon(bImage);
            Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
            // ImageIcon iconscaled = new ImageIcon(image);
            albumArt[i] = image;

         } else {
            albumArt[i] = null;
         }
      }
      return albumArt ;
   }

   @Override
   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      ImageIcon icon = new 
      ImageIcon(getClass().getResource("/images/defaultimage.png"));
      Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
      Image[] albumArt;
        
       try {
          albumArt = getAlbumart(); 
          if(albumArt[row] == null){
             lbl.setIcon(new ImageIcon(image));
          } else {
             lbl.setIcon(new ImageIcon(albumArt[row]));
          }
       } catch (IOException ex) {      
          Logger.getLogger(ImageCellRenderer.class.getName())
                .log(Level.SEVERE, null, ex);
       }
       return lbl;
    }
}   

我接受其他解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-22 22:16:02

代码语言:javascript
复制
Your_JTable.getColumnModel().getColumn(0).setCellRenderer((JTable jtable, Object value, boolean bln, boolean bln1, int i1, int i2) -> {
                JLabel label = new JLabel();
                label.setIcon((ImageIcon) value);
                return label;
            });

有了这个诀窍,就应该做到。它只是将选定的列设置为在其中包含一个JLabel和一个imageIcon。谢谢你@camickr提出解决方案。

票数 -1
EN

Stack Overflow用户

发布于 2022-07-22 20:59:26

首先,我认为没有必要实例化ImageIcon对象以获取BufferedImage的缩放映像,因为这可以直接从BufferedImage本身执行:

代码语言:javascript
复制
Image image = bImage.getScaledInstance(50, 50, Image.SCALE_SMOOTH);

第二种气味就在这句话里:

代码语言:javascript
复制
ImageIcon icon = new ImageIcon(getClass().getResource("/images/defaultimage.png"));
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);

由于图像是从常量静态资源中读取的,所以应该避免重复执行相同的操作:最好读取资源,只构建一次,然后将其存储在静态变量中:

代码语言:javascript
复制
private static final Image MY_STATIC_ICON=readStaticIcon();

private static Image readStaticIcon()
throws IOException
{
    ImageIcon icon = new ImageIcon(MyClass.class.getResource("/images/defaultimage.png"));
    Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);
    return image;
}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Image image = MY_STATIC_ICON;
    Image[] albumArt;
    try {
        albumArt = getAlbumart();
        ...
票数 1
EN

Stack Overflow用户

发布于 2022-07-22 21:06:48

  1. 为什么总是像这样实例化一个新的ImageIcon,难道不能使用一个实例:

吗?

@

@重写公共组件getTableCellRendererComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){ ImageIcon图标=新的hasFocus图像图像= icon.getImage().getScaledInstance(50、50、Image.SCALE_SMO )

2.这是非常昂贵的处理器,您能不能创建图钉并加载现成的映像,而不是像这样动态地生成图像:

代码语言:javascript
复制
Image image = icon.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH);

  1. --您真的需要在单个方法"public Image[] getAlbumart()“中加载所有内容吗?您不能让它在需要显示图像时加载它们吗?很可能你需要一个https://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html

SwingWorker

有一本很棒的书,它将帮助您在java: Applications

  1. 中设计和使用Swing GUI :为桌面Java
  2. 开发动画和图形效果
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73085820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档