java – 将所选文件调整到JFileChooser中的FileFilter

前端之家收集整理的这篇文章主要介绍了java – 将所选文件调整到JFileChooser中的FileFilter前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 java中编写一个图编辑器.此应用程序可以选择导出为各种标准图像格式,如.jpg,.png等.当用户单击File->导出时,您将获得一个JFileChooser,其中包含多个FileFilters,用于.jpg,.png等等

现在这是我的问题:

有没有办法让默认的扩展调整到选定的文件过滤器?例如.如果文件被命名为“lolcat”,则当选择png过滤器时,默认选项应为“lolcat.png”,当用户选择jpg文件过滤器时,默认值应自动更改为“lolcat.jpg”.

这可能吗?我该怎么做?

编辑:
根据下面的答案,我写了一些代码.但它还没有完成工作.我已经将一个propertyChangeListener添加到FILE_FILTER_CHANGED_PROPERTY,但是在这个方法中似乎getSelectedFile()返回null.这是代码.

package nl.helixsoft;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;

public class JFileChooserTest {
    public class SimpleFileFilter extends FileFilter {
        private String desc;
        private List<String> extensions;
        private boolean showDirectories;

        /**
         * @param name example: "Data files"
         * @param glob example: "*.txt|*.csv"
         */
        public SimpleFileFilter (String name,String globs) {
            extensions = new ArrayList<String>();
            for (String glob : globs.split("\\|")) {
                if (!glob.startsWith("*.")) 
                    throw new IllegalArgumentException("expected list of globs like \"*.txt|*.csv\"");
                // cut off "*"
                // store only lower case (make comparison case insensitive)
                extensions.add (glob.substring(1).toLowerCase());
            }
            desc = name + " (" + globs + ")";
        }

        public SimpleFileFilter(String name,String globs,boolean showDirectories) {
            this(name,globs);
            this.showDirectories = showDirectories;
        }

        @Override
        public boolean accept(File file) {
            if(showDirectories && file.isDirectory()) {
                return true;
            }
            String fileName = file.toString().toLowerCase();

            for (String extension : extensions) {   
                if (fileName.endsWith (extension)) {
                    return true;
                }
            }
            return false;
        }

        @Override
        public String getDescription() {
            return desc;
        }

        /**
         * @return includes '.'
         */
        public String getFirstExtension() {
            return extensions.get(0);
        }
    }

    void export() {
        String documentTitle = "lolcat";

        final JFileChooser jfc = new JFileChooser();
        jfc.setDialogTitle("Export");
        jfc.setDialogType(JFileChooser.SAVE_DIALOG);
        jfc.setSelectedFile(new File (documentTitle));
        jfc.addChoosableFileFilter(new SimpleFileFilter("JPEG","*.jpg"));
        jfc.addChoosableFileFilter(new SimpleFileFilter("PNG","*.png"));
        jfc.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY,new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent arg0) {
                System.out.println ("Property changed");
                String extold = null;
                String extnew = null;
                if (arg0.getOldValue() == null || !(arg0.getOldValue() instanceof SimpleFileFilter)) return;
                if (arg0.getNewValue() == null || !(arg0.getNewValue() instanceof SimpleFileFilter)) return;
                SimpleFileFilter oldValue = ((SimpleFileFilter)arg0.getOldValue());
                SimpleFileFilter newValue = ((SimpleFileFilter)arg0.getNewValue());
                extold = oldValue.getFirstExtension();
                extnew = newValue.getFirstExtension();
                String filename = "" + jfc.getSelectedFile();
                System.out.println ("file: " + filename + " old: " + extold + ",new: " + extnew);
                if (filename.endsWith(extold)) {
                    filename.replace(extold,extnew);
                } else {
                    filename += extnew;
                }
                jfc.setSelectedFile(new File (filename));
            }
        });
        jfc.showDialog(frame,"export");
    }

    JFrame frame;

    void run() {
        frame = new JFrame();
        JButton btn = new JButton ("export");
        frame.add (btn);
        btn.addActionListener (new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                export();
            }
        });
        frame.setSize (300,300);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {     
            public void run() {
                JFileChooserTest x =  new JFileChooserTest();
                x.run();
            }
        });     
    }
}

解决方法

看起来您可以收听JFileChooser以更改FILE_FILTER_CHANGED_PROPERTY属性,然后使用setSelectedFile()来适当地更改所选文件的扩展名.

编辑:你说得对,这个解决方案不行.事实证明,当文件过滤器被更改时,如果所选文件文件类型与新的过滤器不匹配,则删除所选文件.这就是为什么当你尝试getSelectedFile()时,你得到null.

你以后考虑加入扩展?当我编写JFileChooser时,通常在用户选择要使用的文件添加扩展名,并单击“保存”:

if (result == JFileChooser.APPROVE_OPTION)
{
  File file = fileChooser.getSelectedFile();
  String path = file.getAbsolutePath();

  String extension = getExtensionForFilter(fileChooser.getFileFilter());

  if(!path.endsWith(extension))
  {
    file = new File(path + extension);
  }
}
fileChooser.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY,new PropertyChangeListener()
{
  public void propertyChange(PropertyChangeEvent evt)
  {
    FileFilter filter = (FileFilter)evt.getNewValue();

    String extension = getExtensionForFilter(filter); //write this method or some equivalent

    File selectedFile = fileChooser.getSelectedFile();
    String path = selectedFile.getAbsolutePath();
    path.substring(0,path.lastIndexOf("."));

    fileChooser.setSelectedFile(new File(path + extension));
  }
});

猜你在找的Java相关文章