Java:jlist中显示文件名的文件列表+;仅扩展

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{

尝试将文件列表添加到Jlist,然后筛选Jlist中的文件以仅返回.txt文件和固定字符长度。还尝试删除返回的文件路径,并仅在文件列表中显示文件名+扩展名

到目前为止,完成了除删除文件路径以外的所有操作。 例如,它仍然返回“C:\java\u help.txt”,而不是JList中的“java\u 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");
            }
        }
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