Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助实现FileNameFilter java吗_Java_Swing_Tree_Jtree - Fatal编程技术网

需要帮助实现FileNameFilter java吗

需要帮助实现FileNameFilter java吗,java,swing,tree,jtree,Java,Swing,Tree,Jtree,我想创建一个应用程序,该应用程序将显示目录中的文件,其名称以字符串(即某个日期)开头。现在我可以显式地使用所有FileNameFilter,但是由于TreeModel是一个接口,所以我不能更改任何内容。在函数getChild(对象父对象,int-index)中,我获取ArrayOutofBoundException,因为当我访问该数组时,该数组变为空,因为过滤器从列表中删除了文件名。我被困在这里,没有可能的解决办法。我尝试了更多的东西 我在这里使用swing大纲 调用TreeModel的代码:

我想创建一个应用程序,该应用程序将显示目录中的文件,其名称以字符串(即某个日期)开头。现在我可以显式地使用所有FileNameFilter,但是由于TreeModel是一个接口,所以我不能更改任何内容。在函数
getChild(对象父对象,int-index)
中,我获取ArrayOutofBoundException,因为当我访问该数组时,该数组变为空,因为过滤器从列表中删除了文件名。我被困在这里,没有可能的解决办法。我尝试了更多的东西

我在这里使用swing大纲

调用TreeModel的代码:

FileTreeModel treeMdl = new FileTreeModel(f);
treeMdl.setDate(strDate);
mdl = DefaultOutlineModel.createOutlineModel(treeMdl, new FileRowModel(), true);
outline.setRenderDataProvider(new RenderData());
outline.setModel(mdl);
类FileTreeModel:

public class FileTreeModel implements TreeModel {

private String date;
private File root;

public FileTreeModel(File root) {
    this.root = root;
}

@Override
public void addTreeModelListener(javax.swing.event.TreeModelListener l) {

}

@Override
public Object getChild(Object parent, int index) {
    File f = (File) parent;
    File[] listFiles = f.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase().startsWith(date);
        }
    });
    return listFiles[index];
}

public void setDate(String Date) {
    date = Date;
}

public Object getChild1(Object parent, int index, String dir, String date) throws IOException {
    File f = (File) parent;
    File[] listFiles = f.listFiles(new FilenameFilter() {
        public boolean accept(File dir, String name) {
            return name.toLowerCase().startsWith(date);
        }
    });

    return listFiles[index].getName();
}

@Override
public int getChildCount(Object parent) {
    File f = (File) parent;
    if (!f.isDirectory()) {
        return 0;
    } else {
        return f.list().length;
    }
}

@Override
public int getIndexOfChild(Object parent, Object child) {
    File par = (File) parent;
    File ch = (File) child;
    return Arrays.asList(par.listFiles()).indexOf(ch);
}

@Override
public Object getRoot() {
    return root;
}

@Override
public boolean isLeaf(Object node) {
    File f = (File) node;
    return !f.isDirectory();
}

@Override
public void removeTreeModelListener(javax.swing.event.TreeModelListener l) {

}

@Override
public void valueForPathChanged(javax.swing.tree.TreePath path, Object newValue) {
    //do nothing
}
}
在这里,我还创建了一个函数
getChild1()
,它可以正确地返回我想要的文件列表,但我无法在接口中获得相同的结果,因为索引参数无法控制

编辑:

输出:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 2
at sr.view.FileTreeModel.getChild(FileTreeModel.java:57)
at org.netbeans.swing.outline.DefaultOutlineModel.getChild(DefaultOutlineModel.java:231)
at javax.swing.tree.FixedHeightLayoutCache$SearchInfo.getPath(FixedHeightLayoutCache.java:1467)
at javax.swing.tree.FixedHeightLayoutCache.getPathForRow(FixedHeightLayoutCache.java:211)
at org.netbeans.swing.outline.Outline.sortAndFilter(Outline.java:511)
at org.netbeans.swing.etable.ETable.convertRowIndexToModel(ETable.java:1599)
at javax.swing.JTable.getValueAt(JTable.java:2719)
at org.netbeans.swing.etable.ETable.getValueAt(ETable.java:772)

没有可行的方法来实现这一点,所以我创建了一个过滤文件列表,我想显示这些文件,并将它们添加到JTree中。最后,当单击“其他”时,添加了一个侦听器以仅打印.pdf文件

如果有人想要这个解决方案,我会在这里粘贴一个要点链接


谢谢

在您的
getChild1()
中,您没有使用参数
dir
,并且您在模型中已经有了日期。那么
getChild()
有什么区别呢?除此之外,您可能还需要考虑在代表节点的某类中包装文件,或者使用<代码> toStrug()/代码>来显示文件名,或者使用您的节点的自定义渲染器。@托马斯<代码> GETHOLD()/<代码>是Swing大纲模型使用的函数,因为它是一个接口。code>getChild1()仅为测试目的而创建,并且成功。但是我不能在
getChild()
中实现过滤器。为了更快地获得更好的帮助,请发布一个or。我的问题是:像您实现的
getChild()
一样实现
getChild1()
有什么问题?正如我所说的,不同的签名应该不是问题,因为您无论如何都不使用
dir
,并且可以从模型本身获取
date
。剩下的是与
getChild()
完全相同的签名(除了抛出声明,但可以通过将异常包装到
RuntimeException
中来解决)。getChildCOunt()方法返回目录中的文件总数。但是getChild()方法会过滤文件列表。你需要始终如一。要么树显示所有文件,所有方法都应处理完整的文件列表,要么树显示筛选列表,所有方法都应处理筛选列表。