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

时间:2014-01-03 19:28:38

标签: java swing file-io jlist

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

到目前为止,除了删除文件路径外,完成了所有操作。 例如,它仍然在JList中返回“C:\ java_help.txt”而不是“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中只保留文件名+扩展名?上述代码的适用示例将不胜感激。

6 个答案:

答案 0 :(得分:1)

我认为这里的问题不是您拥有的代码:文件过滤器看起来没问题。我认为您的投诉是文本在JList

中的显示方式

您需要实施ListCellRender来更改显示文字。

请参阅JList tutorial了解如何执行此操作。

答案 1 :(得分:0)

获取返回值并执行

String[] PartsOfPath = ReturnedPath.split("\");

String JustFileName = PartsOfPath[(PartsOfPath.length - 1)];

我还没有测试过,但我认为这应该有效。显然需要与你需要的变量名称交换。

答案 2 :(得分:0)

由于您在路径中使用了“C:”,我认为您已经在Windows上并想要一些适用于Windows的东西。

修剪路径:

String name=file.getName();
name = name.substring(name.lastIndexOf('\\'));
// ...

这将删除路径,只留下文件名。

显然,它不会在Linux上工作。如果你需要它,你可以切换你正在寻找的角色。在Windows上,这可行。

答案 3 :(得分:0)

问题是accept()课程中的方法TextFileFilter

你的回程线有问题,我不完全确定你在那里做什么。您似乎正在尝试返回该名称。

对我来说,这可以按预期工作:

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

答案 4 :(得分:0)

这样可行,但您只获取String而不是File对象。请注意,如果替换“C:\”,则在需要检索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());

答案 5 :(得分:0)

这里有一个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());你应该被设定。