我想创建一个应用程序,该应用程序将在目录中显示文件,该目录的名称以字符串开头,即某个日期。现在我可以显式地使用所有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)
答案 0 :(得分:0)
由于无法进行这项工作,因此我创建了一个要显示的过滤文件列表,并将其添加到JTree中。最后,添加了一个侦听器,以使其仅在单击时打印.pdf文件,否则将无济于事。
如果有人想要该解决方案,我会在此处粘贴要点链接。
谢谢!