我想创建一个带有图像文件缩略图视图的JFileChooser.所以我将FileView子类化,并在创建 ImageIcon的方法中进行了一些缩放,以显示缩略图.

但是,整体效果是,filechooser小部件在打开目录并显示缩略图之前需要一些时间.在下面的createImageIcon()中,我需要使用图像文件路径两次调用新的ImageIcon(),然后使用调整大小的图像作为构造函数参数.我认为这是减慢小部件的速度.

有没有更有效的替代方案?任何建议/指针都是最受欢迎的.

谢谢,
标记

public static void main(String[] args) { 
    JFileChooser chooser=new JFileChooser();
    ThumbNailView thumbView=new ThumbNailView();
    chooser.setFileView(thumbView);
  }

class ThumbNailView extends FileView{
 public Icon getIcon(File f){
  Icon icon=null;
  if(isImageFile(f.getPath())){
   icon=createImageIcon(f.getPath(),null);
  }
  return icon;
 }
 private ImageIcon createImageIcon(String path,String description) {
  if (path != null) {
   ImageIcon icon=new ImageIcon(path);
   Image img = icon.getimage() ; 
   Image newimg = img.getScaledInstance( 16,16,java.awt.Image.SCALE_SMOOTH ) ;
   return new ImageIcon(newimg);
  } else {
   System.err.println("Couldn't find file: " + path);
   return null;
   }
}

private boolean isImageFile(String filename){
    //return true if this is image
}

解决方法

尽管使用原生的外观和放大器,我还是很惊讶地看到了这一点.感觉在Windows中,文件选择器确实没有缩略图视图.我尝试了你的例子,你沿着正确的方向前进,但我看到有很多大图像的文件夹有多慢.当然,开销是由于读取文件内容然后解释图像时的I / O,这是不可避免的.

更糟糕的是,我发现FileView.getIcon(File)被大量调用 – 在显示文件列表之前,当鼠标悬停在图标上以及选择更改时.如果我们在加载后不缓存图像,我们将无意义地重新加载图像.

显而易见的解决方案是将所有图像加载推送到另一个线程或线程池,一旦我们得到缩小的结果,将其放入临时缓存中,以便可以再次检索它.

我经常使用Image和ImageIcon,我发现可以通过调用setimage(Image)随时更改ImageIcon的图像.这对我们来说意味着,在getIcon(File)中,我们可以立即返回一个空白或默认图标,但保留对它的引用,将其传递给工作线程,该工作线程将在后台加载图像并设置图标的图像后来当它完成时(唯一的问题是我们必须调用repaint()来查看更改).

对于此示例,我使用的是ExecutorService缓存线程池(这是获取所有图像的最快方法,但使用大量I / O)来处理图像加载任务.我也使用WeakHashMap作为缓存,以确保只要我们需要它们就只保留缓存的图标.您可以使用其他类型的Map,但是您必须管理您保留的图标数量,以避免内存不足.

package guitest;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.regex.Pattern;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.filechooser.FileView;

public class ThumbnailFileChooser extends JFileChooser {

    /** All preview icons will be this width and height */
    private static final int ICON_SIZE = 16;

    /** This blank icon will be used while previews are loading */
    private static final Image LOADING_IMAGE = new BufferedImage(ICON_SIZE,ICON_SIZE,BufferedImage.TYPE_INT_ARGB);

    /** Edit this to determine what file types will be previewed. */
    private final Pattern imageFilePattern = Pattern.compile(".+?\\.(png|jpe?g|gif|tiff?)$",Pattern.CASE_INSENSITIVE);

    /** Use a weak hash map to cache images until the next garbage collection (saves memory) */
    private final Map imageCache = new WeakHashMap();

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFileChooser chooser = new ThumbnailFileChooser();
        chooser.showOpenDialog(null);
        System.exit(1);
    }

    public ThumbnailFileChooser() {
        super();
    }

    // --- Override the other constructors as needed ---

    {
        // This initializer block is always executed after any constructor call.
        setFileView(new ThumbnailView());
    }

    private class ThumbnailView extends FileView {
        /** This thread pool is where the thumnnail icon loaders run */
        private final ExecutorService executor = Executors.newCachedThreadPool();

        public Icon getIcon(File file) {
            if (!imageFilePattern.matcher(file.getName()).matches()) {
                return null;
            }

            // Our cache makes browsing back and forth lightning-fast! :D
            synchronized (imageCache) {
                ImageIcon icon = imageCache.get(file);

                if (icon == null) {
                    // Create a new icon with the default image
                    icon = new ImageIcon(LOADING_IMAGE);

                    // Add to the cache
                    imageCache.put(file,icon);

                    // Submit a new task to load the image and update the icon
                    executor.submit(new ThumbnailIconLoader(icon,file));
                }

                return icon;
            }
        }
    }

    private class ThumbnailIconLoader implements Runnable {
        private final ImageIcon icon;
        private final File file;

        public ThumbnailIconLoader(ImageIcon i,File f) {
            icon = i;
            file = f;
        }

        public void run() {
            System.out.println("Loading image: " + file);

            // Load and scale the image down,then replace the icon's old image with the new one.
            ImageIcon newIcon = new ImageIcon(file.getAbsolutePath());
            Image img = newIcon.getimage().getScaledInstance(ICON_SIZE,Image.SCALE_SMOOTH);
            icon.setimage(img);

            // Repaint the dialog so we see the new icon.
            SwingUtilities.invokelater(new Runnable() {public void run() {repaint();}});
        }
    }

}

已知的问题:

1)缩放时我们不保持图像的宽高比.这样做可能会导致图标具有奇怪的尺寸,从而破坏列表视图的对齐方式.解决方案可能是创建一个16×16的新BufferedImage,并在其上方渲染缩放图像,居中.如果你愿意,你可以实现!

2)如果文件不是图像或已损坏,则根本不会显示任何图标.看起来程序只在渲染图像时检测到这个错误,而不是在我们加载或缩放它时,所以我们无法提前检测到.但是,如果我们解决问题1,我们可能会检测到它.

java – 制作jfilechooser显示图像缩略图的更多相关文章

  1. Xcode不显示任务控制视图中所有窗口的标题(4个手指向下滑动)

    MacMissionControl是一个方便的功能,它允许我们导航一个应用程序的不同窗口.大多数应用程序会在每个窗口缩略图下方显示窗口标题,因此很容易找到您想要带到前面的窗口.但是,如果我在Xcode4.2.1中打开一些项目并进行4指滑动,我在窗口缩略图下面看不到任何“标题”或“项目名称”.这很烦人,因为有时窗口预览缩略图并不总是足以识别内部的内容.是否有任何需要更改才能显示的设置?或者它还不可能?

  2. 在iOS中处理大图片

    我发现有一个BitmapFactory类,它有一个inSampleSize选项,可以在Android平台中对照片进行缩减.在iOS上怎么做?

  3. 如何在iOS 7中的UITextField中添加缩略图UIImage?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. iOS – 如何在没有游戏的情况下从视频获取缩略图?

    我正在尝试从视频中获取缩略图并在我的tableview中显示它.这是我的代码:但是图像总是回归黑色.怎么了?

  5. ios – 如何将UIImage保存到文档目录?

    如何将缩略图与其来自的视频一起写入我的文档目录?到目前为止,这是我的代码:解决方法就这么简单:一个建议:如果可以按照苹果的指南再次下载图像,则将图像保存到库/缓存中.

  6. 在Swift中,使用SDWebImage做缓存后获取缩略图的大小

    0//不等于1,执行下一个循环ifcount![0],options:[],progress:nil,completed:{->Voidin//图片缓存完成,但是图片不一定有imageifimage!=nil{//将image转成二进制数据letdata=UIImagePNGRepresentationdataLenth+=data!.length}//dispath_group_leave要放到闭包的最后,才能够正确的测试出。dispatch_group_leave})}//调度组回到主队列dispat

  7. swift – generateCGImagesAsynchronouslyForTimes有时不会生成完整的缩略图

    我正在使用一个使用AVAssetImageGenerator.generateCGImagesAsynchronouslyForTimes的OSX应用程序,它通常工作正常.然而,一段时间后,我回来的缩略图只包含前几行像素,其余的是绿色,有时图像将是不同的绿色.很难跟踪,因为它不会一直发生,但是当大约一半的缩略图受到影响时.这是我期望看到的形象:但经常发生这种情况:以下是我用来生成缩略图的代码:这就

  8. android – MediaStore:获取图像数据,缩略图和文件夹

    我有两个清单.我们称它们为AlbumsList和PicturesList.>第一个显示相册封面,它的名称和图片数量.>第二个显示所选专辑中包含的所有图像.我已经使用File类完成了它,但它工作得太慢,当我只需要来自图库的那些时,它会在设备上找到所有图像.我读过有关MediaStore内容提供商但从未使用过它.所以我有两个问题:>如何使用MediaStore类找到“相册”,缩略图和图片中的图片数量?>如何使用MediaStore类获取特定文件夹中所有图像的文件路径和缩略图?

  9. android – 从图像中删除或更新exif缩略图

    无论如何从图像中删除exif缩略图?我在我的应用程序中裁剪图像并使用sanselan库复制所有exif数据无损.然后,我相应地更新宽度/高度/旋转.我找不到任何方法来更新exif缩略图或删除它,任何想法如何做到这一点?

  10. 如何从Android 4.0及更高版本的远程URL获取视频缩略图?

    实际上,我想显示视频网址中的视频缩略图并在ImageView中显示,然后点击ImageView,VideoView会在另一个活动中显示视频.所以最终我的问题是,我无法从URL获取视频缩略图.我已经尝试了很多,但无法获得任何适用于我的解决方案,有解决方案只能从SD卡视频获取缩略图和远程URL,我找到了一些解决方案,但它不起作用.Below是我试过的.有人能告诉我如何显示URL中的视频缩略图吗?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部