Java:jlist中显示文件名的文件列表+;仅扩展
尝试将文件列表添加到Jlist,然后筛选Jlist中的文件以仅返回.txt文件和固定字符长度。还尝试删除返回的文件路径,并仅在文件列表中显示文件名+扩展名 到目前为止,完成了除删除文件路径以外的所有操作。 例如,它仍然返回“C:\java\u help.txt”,而不是JList中的“java\u help.txt”Java:jlist中显示文件名的文件列表+;仅扩展,java,swing,file-io,jlist,Java,Swing,File Io,Jlist,尝试将文件列表添加到Jlist,然后筛选Jlist中的文件以仅返回.txt文件和固定字符长度。还尝试删除返回的文件路径,并仅在文件列表中显示文件名+扩展名 到目前为止,完成了除删除文件路径以外的所有操作。 例如,它仍然返回“C:\java\u help.txt”,而不是JList中的“java\u help.txt” import javax.swing.*; import java.io.*; public class FileName extends JFrame{
import javax.swing.*;
import java.io.*;
public class FileName extends JFrame{
JPanel pnl=new JPanel();
public static void main (String[]args) {
FileName print=new FileName();
}
JList list;
@SuppressWarnings("unchecked")
public FileName() {
super("Swing Window");
setSize(250,300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
add(pnl);
String path="C:/";
File folder=new File(path);
File[]listOfFiles=folder.listFiles(new TextFileFilter());
list=new JList(listOfFiles);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
pnl.add(list);
pnl.revalidate();
}
}
class TextFileFilter implements FileFilter {
public boolean accept(File file) {
String name=file.getName();
return name.length()<28&&name.endsWith(".txt");
}
}
import javax.swing.*;
导入java.io.*;
公共类文件名扩展了JFrame{
JPanel pnl=新的JPanel();
公共静态void main(字符串[]args){
FileName print=新文件名();
}
JList列表;
@抑制警告(“未选中”)
公共文件名(){
超级(“摇摆窗”);
设置大小(250300);
setDefaultCloseOperation(关闭时退出);
setVisible(真);
添加(pnl);
字符串path=“C:/”;
文件夹=新文件(路径);
File[]listOfFiles=folder.listFiles(新的TextFileFilter());
列表=新的JList(列表文件);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
pnl.add(列表);
pnl.重新验证();
}
}
类TextFileFilter实现FileFilter{
公共布尔接受(文件){
字符串名称=file.getName();
return name.length()获取返回的值并执行以下操作
字符串[]PartsOfPath=ReturnedPath.split(\”;
String JustFileName=PartsOfPath[(PartsOfPath.length-1)];
我还没有测试过,但我认为应该可以。显然,可以使用您需要的变量名进行交换。因为您在路径中使用了“C:”,所以我假设您在Windows上,并且希望使用可以在Windows上工作的东西
只需修剪路径:
String name=file.getName();
name = name.substring(name.lastIndexOf('\\'));
// ...
这将删除路径,只留下文件名
显然,它在Linux上不起作用。如果需要,可以切换要查找的字符。在Windows上,这是可行的。问题在于TextFileFilter
类中的方法accept()
您的回信线路有问题,我不完全确定您在那里试图做什么。看来您正在尝试返回姓名
对我来说,这是可以预期的:
import java.io.File;
public class Test {
public static void main(String[] args) {
File f = new File("C:\\bell.wav");
System.out.println(f.getName());
}
}
打印:bell.wav
如果文件
不适用于您,请尝试改用路径
import java.nio.file.Path;
import java.nio.file.Paths;
public class Test {
public static void main(String[] args) {
Path p = Paths.get("C:\\bell.wav");
System.out.println(p.getFileName());
}
}
Prints:bell.wav这是可行的,但您只获取字符串,而不获取文件对象。请注意,如果您替换“C:\”,则如果需要检索文件对象,文件路径将不再有效。因此,您只有一个文件名列表,而不是文件对象。这可能是“C:\”最初保留在其中的原因
String path = "C:/";
File folder = new File(path);
File[] listOfFiles = folder.listFiles(new TextFileFilter());
List<String> fileNames = new ArrayList<String>();
for (File f: listOfFiles) {
fileNames.add(f.getName().replace(path, ""));
}
list = new JList(fileNames.toArray());
stringpath=“C:/”;
文件夹=新文件(路径);
File[]listOfFiles=folder.listFiles(新的TextFileFilter());
列表文件名=新的ArrayList();
对于(文件f:listOfFiles){
添加(f.getName().replace(路径“”);
}
list=新的JList(filename.toArray());
我认为问题不在于你的代码:文件过滤器看起来没问题。我认为你抱怨的是JList
中文本的显示方式
您需要实现一个ListCellRender
来更改显示文本
有关如何执行此操作的信息,请参见。下面是一个简单的ListCellRenderer实现,wolfcastle建议它可以执行您想要的操作:
class SimpleFileCellRenderer extends DefaultListCellRenderer implements ListCellRenderer<Object>
{
// Use this to show relative paths instead of absolute.
@Override
public Component getListCellRendererComponent(
JList<? extends Object> list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
Path relative = ((File) value).toPath().getFileName();
return super.getListCellRendererComponent(list, relative, index, isSelected, cellHasFocus);
}
}
类SimpleFileCellRenderer扩展DefaultListCellRenderer实现ListCellRenderer
{
//使用此选项可以显示相对路径,而不是绝对路径。
@凌驾
公共组件GetListCellRenderComponent(
jList您可以尝试使用路径
而不是文件
,我相信它有一个.getName()
方法。API使它听起来像getName()应该返回路径的最后一部分,但如果不是,您就不能自己解析字符串吗?只是我的一个不满…不要使用@SuppressWarnings(“未选中”)
,您的编译器抱怨是有原因的,请倾听它以构建健壮的应用程序。您使用的是什么java?因为,不仅API声明它返回文件名(没有路径),但实际上,在我的测试系统上使用OpenJDK和Oracle的java时,它可以正常工作,只返回文件名,不返回路径。这与您的问题无关,但这里有一些常见的Swing问题:您应该将新文件名
行包装在EventQueue.invokeLater
中。还可以将JList
放在JScrol中lPane
,并在构建完成后将面板添加到JFrame
中:这样就不需要调用revalidate。OP有问题。file.getname()
确实只返回文件名+扩展名,不返回路径。我已经在OpenJDK和Oracle的java上进行了测试,都是java 7。@SnakeDoc您可能是对的。我通常使用someFile.getAbsolutePath()
,这可能就是我在这里想的。不,你是对的,OP正在尝试获取文件名+扩展名,而没有路径。但是,不是创建一些“hack”要做到这一点,OP需要确定为什么适用于其他人的标准java方法不适用于他。此外,为了更健壮的程序,不要硬编码\\,而是使用System.getProperty(“file.separator”)
在windows上返回特定于系统的目录分隔符…\n(实际上\\因为它是java),以及Unix/Linux上的/
。谢谢,我正在寻找类似System.getProperty(“file.separator”)
的内容。OP有一些错误。file.getname()确实只返回文件名+扩展名,不返回路径。我已经在OpenJDK和Oracle的java上进行了测试,这两种java都是java 7。为什么要创建一个可以从标准java库工作的黑客程序呢?SnakeDoc 1。这不是h