需要帮助实现FileNameFilter java

时间:2018-08-10 09:47:03

标签: java swing tree jtree

我想创建一个应用程序,该应用程序将在目录中显示文件,该目录的名称以字符串开头,即某个日期。现在我可以显式地使用所有FileNameFilter了,但是由于TreeModel是接口,所以我什么也不能更改。在函数getChild(Object parent , int index)中,我得到ArrayOutofBoundException,因为在我访问数组时该数组为空,因为过滤器从列表中删除了文件名。我被困在这里,没有可能的解决方案。我已经尝试了更多的东西。

我在这里使用挥杆轮廓。

调用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(),该函数可以按照我想要的方式正确返回文件列表,但是由于无法控制index参数,我无法在Interface中获得相同的结果。

编辑:

输出:

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)

1 个答案:

答案 0 :(得分:0)

由于无法进行这项工作,因此我创建了一个要显示的过滤文件列表,并将其添加到JTree中。最后,添加了一个侦听器,以使其仅在单击时打印.pdf文件,否则将无济于事。

如果有人想要该解决方案,我会在此处粘贴要点链接。

谢谢!