[英]Java: list of files in jlist showing filename+extension only
尝试将文件列表添加到Jlist中,然后过滤JList中的文件以仅返回.txt文件和固定的字符长度。 也尝试删除返回的文件路径,并且仅在文件的JList中显示filename +扩展名。
到目前为止,除删除文件路径外,已完成所有操作。 例如,它仍然返回“ C:\\ java_help.txt”,而不是JList中的“ java_help.txt”。
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");
}
}
我以为getName()应该可以做到这一点,但事实并非如此。 如何从文件名中删除路径,而在JList中仅保留文件名和扩展名? 上面代码的适用示例将不胜感激。
我认为这里的问题不是您拥有的代码:文件过滤器看起来还可以。 我认为您的抱怨是如何在JList
显示文本。
您需要实现一个ListCellRender
来更改显示文本。
有关如何执行此操作,请参见JList教程 。
取回值并做
String[] 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
如果File
对您不起作用,请尝试使用Paths
。
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());
}
}
印刷品:bell.wav
这可行,但是您只会得到String而不是File对象。 请注意,如果替换“ C:\\”,则如果需要检索File对象,则File路径将不再有效。 因此,您只拥有一个文件名列表,而不是File对象。 这可能是“ 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());
这是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);
}
}
只需调用JList.setCellRenderer(new SimpleFileCellRenderer()); 并且应该被设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.