如何在Linux中的图像文件选择器上显示图像缩略图

时间:2016-11-07 09:43:40

标签: java swing thumbnails jfilechooser

如何使用java代码在Linux(Ubuntu)机器上的文件选择器上显示图像缩略图。我已经尝试了一些在Windows平台上成功运行的代码(请参阅此链接:making jfilechooser show image thumbnails)。

public class ThumbnailFileChooser extends JFileChooser {

    private static final int ICON_SIZE = 16;
    private static final Image LOADING_IMAGE = new BufferedImage(ICON_SIZE, ICON_SIZE, BufferedImage.TYPE_INT_ARGB);
    private final Pattern imageFilePattern = Pattern.compile(".+?\\.(png|jpe?g|gif|tiff?)$", Pattern.CASE_INSENSITIVE);
    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();
    }

    {
        setFileView(new ThumbnailView());
    }

    private class ThumbnailView extends FileView {

        private final ExecutorService executor = Executors.newCachedThreadPool();

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

            synchronized (imageCache) {
                ImageIcon icon = imageCache.get(file);

                if (icon == null) {
                    icon = new ImageIcon(LOADING_IMAGE);
                    imageCache.put(file, 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, 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();
                }
            });
        }
    }

}

但是在Linux中它不像在Windows中那样工作。

1 个答案:

答案 0 :(得分:0)

您的代码在Ubuntu 1604上适用于我。请尝试以root身份运行它以确保它不是权限问题。