【问题标题】:Java: list of files in jlist showing filename+extension onlyJava:jlist 中的文件列表仅显示文件名+扩展名
【发布时间】:2014-01-03 19:28:38
【问题描述】:

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

到目前为止,除了删除文件路径之外,一切都完成了。 例如,它仍然返回“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 中只留下文件名+扩展名?上面代码的适用示例将不胜感激。

【问题讨论】:

  • 你可以尝试用Paths代替File,我相信它有.getName()的方法。
  • API 听起来 getName() 应该返回路径的最后一部分,但如果不是,你不能自己解析字符串吗?
  • 只是我的一个小毛病...不要使用@SuppressWarnings("Unchecked"),您的编译器抱怨是有原因的,为了构建强大的应用程序而倾听它。
  • 你用的是什么java?因为,API 不仅声明它返回文件名(没有路径),而且在我的测试系统上使用 OpenJDK 和 Oracle 的 java 时,它按预期工作,只返回文件名,没有路径。
  • 与您的问题无关,但您在此处遇到了一些常见的 Swing 问题:您应该将 new FileName 行包含在 EventQueue.invokeLater 中。还把JList放在JScrollPane里面,全部建好后把面板加到JFrame里面:这样就不用调用revalidate了。

标签: java swing file-io jlist


【解决方案1】:

我认为这里的问题不在于您拥有的代码:文件过滤器看起来不错。我认为您的抱怨是文本在JList 中的显示方式。

您需要实现ListCellRender 来更改显示文本。

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

【讨论】:

  • 哇,我不敢相信这么多人错过了这个。 +1。只是其他人认识到这一点。 ListCellRenderer 负责确定模型中的信息如何显示。 Woot 进一步的上下文,表明 OP 修改那里的模型数据是错误的,因为他们可能需要完整的文件参考以进行进一步处理
  • 几个小时后放弃,改为实现 ListCellRenderer。之前应该这样做:P。谢谢!
【解决方案2】:

取返回值并做

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

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

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

【讨论】:

  • OP 有问题。 file.getname() 确实只返回文件名+扩展名,没有返回路径。我在 OpenJDK 和 Oracle 的 java 上测试过,都是 Java 7
【解决方案3】:

由于您在路径中使用了“C:”,我假设您在 Windows 上并且想要在 Windows 上运行的东西。

只需修剪路径:

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

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

显然,它不适用于 Linux。如果需要,您可以切换您正在寻找的角色。在 Windows 上,这有效。

【讨论】:

  • OP 有问题。 file.getname() 确实只返回文件名+扩展名,没有返回路径。我已经在 OpenJDK 和 Oracle 的 java 上进行了测试,都是 Java 7。
  • @SnakeDoc 你可能是对的。我通常使用someFile.getAbsolutePath(),这可能是我在这里想到的。
  • 不,你是对的,OP 正在尝试获取文件名+扩展名,没有路径。但是,OP 不需要创建一些“hack”来做到这一点,而是需要确定为什么适用于其他所有人的标准 java 方法对他不起作用。
  • 另外,为了更健壮的程序,不要硬编码 \\ ,而是使用 System.getProperty("file.separator") 它将返回系统特定的目录分隔符... \ 在 windows 上(实际上是 \\因为它是 java),在 Unix/Linux 上是 /
  • 谢谢,我正在寻找类似System.getProperty("file.separator") 的东西。
【解决方案4】:

问题是您在 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

【讨论】:

    【解决方案5】:

    这可行,但您只能获得 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());
    

    【讨论】:

    • 为什么要为应该只适用于标准 java 库的东西创建一个 hack?
    • SnakeDoc 1. 这不是 hack,Swing 基于过早的数组(否则您必须建议创建 AbstractListModel 到 OP),2. 此代码来自此论坛并基于其中一个帖子@Andrew Thompson (FileFilter 必须仅返回过滤后的文件,基于过滤器作为参数)
    • @peeskillet 搜索他的帖子,没有必要
    • @mKorbel 我想你可能错过了我的意思。 file.getName(),根据标准java库,只返回文件名+扩展名,不返回路径。这就是我所指的“黑客”。 OP在某个地方出了点问题。
    【解决方案6】:

    这里是 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());你应该被设置。

    【讨论】:

    • 一些解释总是有帮助的
    • 基本上你覆盖了默认的ListCellRenderer,修改了“value”参数,去掉了绝对路径,就这样发送了。
    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2019-12-26
    • 2016-12-06
    • 2021-01-13
    相关资源
    最近更新 更多