Java JFileChooser的过滤器应该只显示目录,但实际上无法仅显示目录。

7

我正在尝试通过使用具有以下内容的javax.swing.filechooser.FileFilter对象,即在accept(File file)重写方法中:return file.isDirectory();,以使此JFileChooser对象仅显示目录(而不是文件)。 但是,至少在我的Mac上,似乎无法防止文件与目录一起显示(除非使用setFileSelectionMode()方法防止选择文件)。

问题:

我错过了什么吗? 如果没有,是否有人曾经遇到过这种情况?

我所理解的/假设的:

  1. 当您将javax.swing.filechooser.FileFilter对象传递给JFileChooser的setFileFilter()方法时,应该会出现魔术般的效果。
  2. 看起来我的带有setFileFilter()的JFileChooser的行为就像使用setSelectionMode(JFileChooser.DIRECTORIES_ONLY);一样。

代码:

import java.io.File;
import javax.swing.filechooser.FileFilter;

// inside a method that's adding this to a JPanel

_fileChooser = new JFileChooser( "." );
_fileChooser.setControlButtonsAreShown( false );
_fileChooser.setFileFilter( new FolderFilter() );
// _fileChooser.setFileSelectionMode( JFileChooser.DIRECTORIES_ONLY );
_panelMidLeft.add( _fileChooser );

// an inner class, defined somewhere else in the class

private class FolderFilter extends javax.swing.filechooser.FileFilter {
  @Override
  public boolean accept( File file ) {
    return file.isDirectory();
  }

  @Override
  public String getDescription() {
    return "We only take directories";
  }
}

谢谢!

Alex


请学习常见的Java命名规范(特别是用于类、方法和属性名称的大小写),并始终保持一致。 - Andrew Thompson
谢谢您的建议。除了使用“_”(在我的情况下实际上是用来表示实例变量),您是否介意在我现在浏览网络文档时指出一些事情?关于惯例方面的。 - Alex Ku
1个回答

15

Your code works for me. My SSCCE:

import java.io.File;
import javax.swing.JFileChooser;

public class ShowDirectoriesOnly {
   public static void main(String[] args) {
      JFileChooser fileChooser = new JFileChooser( "." );
      fileChooser.setControlButtonsAreShown( false );
      fileChooser.setFileFilter( new FolderFilter() );
      fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
      fileChooser.showOpenDialog(null);
   }

   private static class FolderFilter extends javax.swing.filechooser.FileFilter {
      @Override
      public boolean accept( File file ) {
        return file.isDirectory();
      }

      @Override
      public String getDescription() {
        return "We only take directories";
      }
    }
}

如果您仍然遇到问题,最好的方法是创建自己的SSCCE以演示您的问题。
编辑
在使用JDK1.7的OS X下的外观截图。

OS X screenshot


2
这段代码向我展示了一个JFileChooser,其中所有文件都被灰掉并且不可选择,但仍然可见(OS X,JDK 1.7)。对于SSCCE的加分,使测试变得非常简单。 - Robin
2
@HovercraftFullOfEels 我在您的帖子中添加了一张屏幕截图,以便其他人可以清楚地看到 JFileChooser 在 OS X 下的行为不同。 - Robin
@Alex:我已经为你的原始帖子点赞,因为它非常有启发性,组织得很好,并且对于第一篇帖子来说代码格式也很好。你应该很快就能获得10个声望点数。 - Hovercraft Full Of Eels
2
@trashgod - 啊,原来是与Mac有关的问题。谢谢!(将你的评论复制在这里以便日后参考)来源:https://dev59.com/KHE85IYBdhLWcg3wNw14#2883595 "@mmyers: 根据实证,这取决于平台,在Mac OS X上所有支持的外观中,文件显示为灰色。- trashgod May 21 '10 at 17:02" - Alex Ku
我在最新的 Mac 上遇到了这个问题,看到了相同的问题。文件可见,并强制我要滚动额外的内容才能到达我想要的位置。该问题出现在我的代码中,我刚刚使用 Hovercraft SSCCE 复现了它。我不知道有什么解决办法。 - Christopher
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接