- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
“导出”时,您会得到一个 JFileChooser,其中包含许多 -6ren">
我正在用java编写一个图表编辑器。该应用程序可以选择导出为各种标准图像格式,例如 .jpg、.png 等。当用户单击"file"->“导出”时,您会得到一个 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()适当更改所选文件的扩展名
.
编辑:你是对的,这个解决方案不起作用。事实证明,当更改文件过滤器时,如果所选文件的文件类型与新过滤器不匹配,则所选文件将被删除。这就是为什么当您尝试 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 - 将选定的文件调整为 JFileChooser 中的 FileFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119257/
我正在尝试创建一个文件过滤器,它只允许用户打开包含特定文件的目录。用例是这些目录是工作区,内部有一个名为 smart.workspace 的文件。 目前我的过滤器如下... class SMARTWo
我正在尝试找到一个 java.io.FileFilter 的实现,它理解如下模式:"**/*.xml", "src/**/*.java”等 不知道有没有package可以提供这样的filter(com
所以我只想列出指定目录中的目录。我尝试了 FileFilter 和 FilenameFilter。两者都不适合我,因为它们还包括文件。但是不知何故,SO 上的其他人对此没有问题。 java versi
我有一个包含几个 .txt 文件的目录。让我们说 hi.txt hello.txt hello_test.txt test.txt 在 VBA 中使用文件对话框,如何过滤以在下拉列表中仅显示“*tes
我最终使用 Eng. 的方法在 JFileChooser 的 JList 和 JComboBoxes 中自定义了选择颜色。福阿德建议here public void customizeJFileCho
我想向用户显示一个 FileChooser,他只能选择 .csv 文件,但他可以浏览文件系统以找到他想要的 .csv。通读http://download.oracle.com/javase/tutor
在我的项目中,我使用 JavaFX FileChooser 让用户保存文件。我注意到一个错误,其中具有指定文件过滤器的文件在 Linux 系统上总是保存为 .txt。从另一个 stackoverflo
我正在使用一个小型 Java 工具来根据一组文件扩展名获取一组文件,我在使用 listFiles() 和使用 continue; 之间争论不休,当我遇到一个错误的文件时,与使用自定义 FileFilt
我的 Kotlin Android 应用程序中有以下 FileFilter: fileArray = fileDirectory.listFiles { file, filename -> fil
Eclipse 显示两个错误: JFileChooser 类型中的 addChoosableFileFilter 方法不适用于参数 类型不匹配:无法从 FileNameExtensionFilter
当我执行这段代码时,我遇到了这个奇怪的问题: cdrFiles = dir.list(filter); System.out.println("cdrFiles length: " + cdrFile
我正在用java编写一个图表编辑器。该应用程序可以选择导出为各种标准图像格式,例如 .jpg、.png 等。当用户单击"file"->“导出”时,您会得到一个 JFileChooser,其中包含许多
我将简要解释我正在发生的事情,然后提供一些我的代码。 我有一个小型 GUI,我可以在 JComboBox 上选择一个选项,然后单击一个按钮,打开一个 JFileChooser,该按钮应根据 JComb
我试图扩展我发现的教程 here关于创建一个简单的文件浏览器。我想添加一个 FileFilter 以仅查看音频文件。但是,除了我在 String 数组中定义的文件类型之外,我仍然看到其他文件类型。感谢
下面是我的代码,通过单击按钮打开 JFileChooser。我创建了一个过滤器,只允许选择 .jpg 文件,但我的代码没有按预期工作。所有类型的文件都显示在 JFileChooser 对话框中。部分代
我想要一个有 2 个选项的文件过滤器,一个显示所有文件,另一个显示特定扩展名。 具体的扩展应该是默认选择的那个。 我两次使用相同的 JFileChooser,第一次显示 .fas 文件,第二次显示 .
大家下午好 我有一个 javax.swing.JFileChooser 的实例我添加了一些可选的 javax.swing.FileFilter使用 addChoosableFileFilter . 然
我有以下 FileFilter 代码: final FileFilter directoryFilter = new FileFilter() @Override public boo
我正在编写一个简单的程序,以递归方式列出目录中的文件 .class。 最初我这样编码: public class Parsing{ public static void main(String
我正在用 Java 编写图表编辑器。此应用程序可以选择导出为各种标准图像格式,例如 .jpg、.png 等。当用户单击文件 -> 导出时,您会得到一个 JFileChooser,其中有许多 FileF
我是一名优秀的程序员,十分优秀!