我在
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)); } });