实现JFileChooser中的文件类型过滤器和图片预览缩略图

本文介绍如何在Java中为JFileChooser添加图片预览功能,并实现自定义文件过滤器,允许用户仅选择特定扩展名的图片文件。通过设置Accessory组件和自定义FileFilter、FileView来完成这一目标。尽管JFileChooser存在限制,但通过研究API和参考资料,成功实现了类似Windows文件浏览器的缩略图展示。代码较长,包含4个关键类:FileChooserDemo、ImagePreviewPanel、GenericFileFilter和GenericFileView。文章最后表达了作者在解决此问题过程中遇到的挑战和学习心得。
摘要由CSDN通过智能技术生成

第二个Issue的进度很怪,谈不上快还是慢,事实是从网上找了好久找到了一些相关的例子,以此,可以初步作出一个符合要求的"Add image preview window to JFileChooser. add an Image Filter, only image file can be choosed.  "

例子来自网上,图片预览控件借助JFileChooser.setAccessory(JComponent newAccessory)添加,JFileChooser类封装得死死的,什么也挖不出来,先后找到了FileFilter、FileSystemView、FileView,借此实现了针对任意扩展名的Filter,Filter解决得差不多,反过来image preview又需要完善了,希望呈现一种windows环境中文件浏览器可以提供的所谓Thumbnails(缩略图),回过头去狂查JFileChooser,不知该从哪里入手,先后在FileView(用图片本身代替文件固有图标)和FileSystemView(借用系统本身标准文件系统的图标)中找到一些有用的东西,二者互助实现了稍微好一点的缩略图策略,当然我个人还不是很满意,为什么就不能想windows里面那样给我痛快地显示出来呢?问题估计还是sun的JFileChooser太旧了,也不更新下,你说就算不更新,也给我们一些开放度大点的东西吧,啧啧,非逼得我挑剔。期间,试用了UIManager的Look and Feel,找到windows下面的,看来下还凑合,只是左边的快捷图标怎么没有scrollpane呢?郁闷死我。

任务仍在进一步完善中,我也逐渐培养自己写这种业余水平的总结心得的习惯,但愿以后既有很规范的文档总结,有能有我自己独特的心路历程吧。以下附代码,比较长,中间尽量也放些讲解,技术blog可能这点好很多吧,其他的都还限制长度。

ps:中间一度查阅提供给我的英文网页,看的吐血了n次。以后还会碰到很多,初步需要jdk中的demo和api 源代码,其次借助tutorial、doc和javaworld等其他一些文档资料,进一步了解java,还下了一个java实用程序设计100例原代码和素材,不知有用没。

1. FileChooserDemo,主演示类,在第三个按钮下是JFileChooser,里面添加预览和Filter

import  java.io. * ;
import  java.awt. * ;
import  java.awt.event. * ;
import  javax.swing. * ;
import  javax.swing.event. * ;

public   class  FileChooserDemo  extends  JFrame  {
    
private JButton btn1, btn2, btn3, btn4;

    
private JTextArea area;

    
private ObjectOutputStream output;

    
private JScrollPane scroll;

    
private JPanel panel;

    
public FileChooserDemo() {
        
super("FileChooser Demo");

        btn1 
= new JButton("Open Directory");
        btn1.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent e) {
                JFileChooser choose 
= new JFileChooser();
                choose.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

                
int result = choose.showOpenDialog(null);

                
if (result == JFileChooser.APPROVE_OPTION)// if approve (yes,
                
// ok) is chosen
                {
                    File file 
= choose.getSelectedFile();

                    
if (!file.exists())
                        area.append(
"File does not exist~!");

                    
else if (file.isDirectory()) {
                        area.append(
"Directory " + file.getName()
                                
+ " containt following files:  ");
                        
for (int i = 0; i < file.list().length; i++)
                            area.append(file.list()[i] 
+ " ");
                    }
 else if (file.isFile())
                        area
                                .append(
"It is a file, please use the second button to hava another test ");
                }
 else
                    
return;
            }

        }
);

        btn2 
= new JButton("Open a file");
        btn2.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent e) {
                JFileChooser choose 
= new JFileChooser();
                choose.setFileSelectionMode(JFileChooser.FILES_ONLY);

                
int result = choose.showOpenDialog(null);

                
if (result == JFileChooser.APPROVE_OPTION)// if approve (yes,
                
// ok) is chosen
                {
                    File file 
= choose.getSelectedFile();

                    
if (!file.exists())
                        area.append(
"File does not exist~!");

                    
else {
                        
try {
                            output 
= new ObjectOutputStream(
                                    
new FileOutputStream(file));
                            
// .....
                            
// tobeContinued
                        }
 catch (IOException ioexception) {

                            area.append(ioexception.toString());
                        }

                    }

                }
 else
                    
return;
            }

        }
);

        btn3 
= new JButton("Images File Filter");
        btn3.addActionListener(
new ActionListener() {
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要设置 JFileChooser 只允许选择 XML 文件、单个文件和文件夹类型,你可以使用 `setFileFilter` 方法来设置文件过滤器,并使用 `setFileSelectionMode` 方法来设置选择模式。 以下是示例代码,演示如何设置 JFileChooser 只允许选择 XML 文件、单个文件和文件夹类型: ```java import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; public class Example { public static void main(String[] args) { JFileChooser fileChooser = new JFileChooser(); // 只允许选择 XML 文件 FileNameExtensionFilter xmlFilter = new FileNameExtensionFilter("XML Files", "xml"); fileChooser.setFileFilter(xmlFilter); // 只允许选择单个文件和文件夹 fileChooser.setMultiSelectionEnabled(false); fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); int result = fileChooser.showOpenDialog(null); if (result == JFileChooser.APPROVE_OPTION) { System.out.println("选的文件/文件夹路径:" + fileChooser.getSelectedFile().getAbsolutePath()); } else { System.out.println("用户取消了选择"); } } } ``` 在上面的示例代码,我们首先创建了一个 JFileChooser 对象。然后,通过 `FileNameExtensionFilter` 类创建一个过滤器,用于只允许选择 XML 文件。通过调用 `setFileFilter` 方法将该过滤器应用到 JFileChooser 上。 接下来,我们通过调用 `setMultiSelectionEnabled(false)` 将多选模式设置为禁用,然后通过调用 `setFileSelectionMode` 将选择模式设置为 `FILES_AND_DIRECTORIES`,即允许选择单个文件和文件夹。 最后,我们通过判断用户选择的结果,打印出选的文件/文件夹路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值