java – 将所选文件调整到JFileChooser中的FileFilter
发布时间:2020-12-14 05:26:11 所属栏目:Java 来源:网络整理
导读:我在 java中编写一个图编辑器.此应用程序可以选择导出为各种标准图像格式,如.jpg,.png等.当用户单击File-导出时,您将获得一个JFileChooser,其中包含多个FileFilters,用于.jpg,.png等等 现在这是我的问题: 有没有办法让默认的扩展调整到选定的文件过滤器?例
|
我在
java中编写一个图编辑器.此应用程序可以选择导出为各种标准图像格式,如.jpg,.png等.当用户单击File->导出时,您将获得一个JFileChooser,其中包含多个FileFilters,用于.jpg,.png等等
现在这是我的问题: 有没有办法让默认的扩展调整到选定的文件过滤器?例如.如果文件被命名为“lolcat”,则当选择png过滤器时,默认选项应为“lolcat.png”,当用户选择jpg文件过滤器时,默认值应自动更改为“lolcat.jpg”. 这可能吗?我该怎么做? 编辑: 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));
}
});
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
