问题是这样的,在JFileCHooser里面我需要这样的功能,默认的另存为文件文件名为test
然后有.txt .doc .xml这样的不同文件类型的过滤器,我希望在用户选择.txt这样的过滤器之后另存为文件名test变为test.txt,我找了很长时间没有找到实现方法,特此求教各为大侠。

解决方案 »

  1.   

    自己继承JfileChooser 重写里面的方法。
      

  2.   

    可以使用javax.swing.filechooser.FileNameExtensionFilter
    demo在jdk\demo\jfc\FileChooserDemo,代码也在里面。
    用的时候,开始会有选项,设置Filter Controls>Show JPG and GIF Filters, With File Extensions
      

  3.   


    您说的这个例子好像只是一般的FileFilter,只能做到选择不同的过滤器上面的文件显示不同,我希望的是选择了这个过滤器之后用户输入的test也能自动更改为test.jpg这样的样子。不知道您给的这个demo是不是我没看懂?
      

  4.   

    这个不是你JFileChooser(简作jfc)该做的。
    你的代码在获取用户选择的File后,如果判断出File的扩展名不是.txt,那么就自动改文件int result = jfc.showSaveDialog(yourParentSwingComponent);
    if (result == JFileChooser.APPROVE_OPTION) {
      File file = jfc.getSelectedFile();
      if (!file.getFileName().toLowerCase().endsWith(".txt")) {
        file = new File(file.getParent(), file.getName() + ".txt");
      }
      saveDocInFile(file);
    }
      

  5.   


    我只是看word里面另存为的时候就是这么实现的效果,希望用JFileChooser实现这样的效果。比如我写的java程序希望用户另存为三种格式doc pdf txt格式,然后通过FileFilter进行文件后缀的控制,当用户选择txt格式说明用户希望另存为txt格式,那么希望在JFileChooser上能自动更改JFileChooser的文件名,就是希望这样的效果,跟word的doc另存为docx xml的效果一样
      

  6.   

    我觉得,你应该考虑一下我的建议,自己复写JfileChooser既然你不知道写,给你个例子package com.ekingstar.cipherapp;import java.io.File;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;import javax.swing.JFileChooser;
    import javax.swing.JOptionPane;public class FileCheckChooser extends JFileChooser {
    private static final long serialVersionUID = -7281758066216188169L;

    public void approveSelection() {
    File file=this.getSelectedFile();
    Pattern pattern=Pattern.compile("[:,\",<,>,\\|]");
    Matcher matcher=pattern.matcher(file.getName());
    if(matcher.find()){
    JOptionPane.showMessageDialog(this, "不能输入以下字符:\r\n  \"  :  <  >  |","错误",JOptionPane.ERROR_MESSAGE);
    return ;
    }
    String modle=this.getApproveButtonText();
    if("载入".equals(modle)){
    if(!file.exists()){
    JOptionPane.showMessageDialog(this, "文件不存在","错误",JOptionPane.ERROR_MESSAGE);
    return ;
    }
    Pattern pattern1=Pattern.compile("^.*\\.key$");
    Matcher m= pattern1.matcher(file.getName());
    boolean check= m.matches();
    if(!check){
    JOptionPane.showMessageDialog(this, "请选择密钥文件","错误",JOptionPane.ERROR_MESSAGE);
    return ;
    }
    }else if("生成".equals(modle)){
    if(file.exists()){
    int select=JOptionPane.showConfirmDialog(this, "文件已经存在,是否需要覆盖?","提示",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE);
    if(select==JOptionPane.NO_OPTION){
    return;
    }
    }
    }
    super.approveSelection();
    }
    }
    this.jfc=new FileCheckChooser();
    this.jfc.setAcceptAllFileFilterUsed(false);
    FileNameExtensionFilter fnef=new FileNameExtensionFilter("Key File","key");
    jfc.setFileFilter(fnef);
      

  7.   


    我个人觉得这确实是解决问题的办法,只是我想要的效果必须要找到FileFilter与JFileChooser里面的各个SWING组件配合的具体机制,具体来说就是能够对文件过滤器切换的行为进行侦听,否则不可能实现。水平有限,我自己看JFileChooser的源码没有找到。您提供的这个例子有帮助,这个例子只是添加了逻辑控制,对于具体想要的功能没有什么借鉴意义。
      

  8.   

    楼主,你对代码的理解过于狭隘,我提供的只是JFileChooser对于文件过滤的一种方式以及运用,对于你的需求,选择文件过滤器,然后保存时也使用与过滤器相同的后缀,这些是需要你自己去实现的,文件的路径,文件的名称都要你自己去实现
      

  9.   


    我想你没有真正看懂我的问题,我对代码理解也没这么狭隘,我想要的是在选择过滤器的时候,在另存为一个新文件的时候,用户不需要输入后缀,只输入文件名,JFileChooser上面的文件名能自动更改
      

  10.   


    我知道你想要实现的功能,因为我做过一个这样的功能,保存文件的文件名其实是程序中加进去的,用户在输入框输入文件名并保持的时候,程序可以获得这个输入,然后并修改,然后保存文件,这不是JFileChooser的功能,而是自己实现的功能,也就是说你完全可以检测文件名是否以.key结尾,如果是则不加后缀,如果有则加上.key结尾,当然,你可以先获得用户选择了什么文件类型并保持,然后根据文件类型添加相应的后缀。
      

  11.   

    感谢您的回答:
    1.这个的确不是JFileChooser应自带的功能,但是我想实现,想问。
    2.你说的程序检测我会做,没啥难度。我想要的就是能够让用户选择文件之后,文件名称——注意是在JFileChooser的文件名称改变,而不单纯是你程序保存文件名称改变。
    3.没有找到如何实现的方法,不知道怎么拓展JFileChooser对UI的这个行为设置。最后还是想说,最重保存文件的逻辑没任何问题了,就是JFileChooser的UI我想实现下。
      

  12.   

    如果要更改UI的行为,就要向我那样继承JFileChooser类,实现自己的类,然后覆盖对应的方法来更改JFileChooser的行为,这种方式能更改掉任何行为,但是你需要找到那个行为的方法,关于这个问题,你可以去查jdk document JFileChooser以及其父类的帮助,使用继承,还可以改变JFileChooser上面的界面样式以及组件和展示方式,当然,这些都要你自己去做了。