我正在用Java编写图编辑器。这个程序有选择导出到各种标准图像格式,如为.jpg,.png等。当用户点击文件-
导出,你就会得到一个
JFileChooser
具有一些FileFilter
,它出现,对.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()
。
编辑:您是对的,此解决方案无效。事实证明,更改文件过滤器后,如果所选文件的文件类型与新过滤器不匹配,则该文件将被删除。这就是为什么null
您尝试时得到的原因getSelectedFile()
。
您是否考虑过以后添加扩展名?在编写时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));
}
});
如何在JFileChooser中隐藏“可选文件筛选器小部件”?所谓“可选文件筛选器小部件”,我指的是下面包含“文件格式”字样的面板。 文档中有很多关于如何修改小部件中出现的特定过滤器的信息,但我不知道如何完全隐藏它。 我正在使用JFileChooser来选择一个目录,所以这个小部件是不必要的。 最后,我采纳了Andrew Thompson的建议,将筛选器选择器设置为显示文本“Directories
好的,所以我已经制作了一个文本编辑器,到目前为止,它可以使用JFileChooser创建新文件和打开文件。 我正在努力做的是让文件的保存工作。每次添加或打开一些文件时,它都会向tabbedpane中添加一个新的选项卡,名称要么是文件1等,要么是打开的文件的名称。 另外,我如何使一个文件的当前选定标签textarea?我试过了,但不行: 所以我需要在textArea中创建一个字符串文件。
问题内容: 我觉得应该有一个简单的方法来做到这一点,但我不知道。我有一个JFileChooser,它允许用户选择目录。我想显示目录中的所有文件,以便为用户提供一些上下文,但是只应接受目录作为选择(选择文件时可能会禁用“打开”按钮)。有一个简单的方法吗? 问题答案: 重写approveSelection()方法。就像是:
在我的程序中,我想让用户能够将一个文件保存到他们选择的目录中。在做了一点研究之后,我发现了这个名为JFileChooser的俏皮类。我想做的是允许用户通过JFileChooser GUI转到他们想要的目录,为他们的文件键入一个名称,并允许他们将他们的文件保存到想要的目录。我试着在网上寻找一个解决方案,如何做到这一点,但几乎在我读到的所有地方,最后的答案都是“现在你必须让你的程序保存文件”,但我不知
问题内容: 我想在this的文本框中设置默认文件名。我可以设置吗? 问题答案: 使用以下代码: 您必须指定完整路径
问题内容: 我正在尝试使用JFileChooser保存图像。我只希望用户能够将图像另存为jpg。但是,如果他们不输入.jpg,它将不会另存为图像。是否可以以某种方式将“ .jpg”附加到文件末尾? 在将字符串添加到文件时不起作用。 问题答案: 完成后,为什么不将转换为并创建一个新的呢? 请记住,如果已经存在,则不需要添加。