在我的应用程序中,我希望用户能够选择一个目录来存储内容.我有一个文本字段,我用它来显示他们选择的目录.如果他们只是点击一个目录(不要浏览它),一切都很好.但是,如果他们双击目录并查看其中,则目录名称是重复的.
防爆.他们在主目录中,单击文件夹桌面...返回的路径是〜/ Desktop.另一方面,如果它们在主目录中,双击文件夹Desktop,现在在Desktop文件夹中,返回的路径是〜/ Desktop/Destkop.
这是我正在做的事情:
JFileChooser chooser = new JFileChooser();
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File f = chooser.getSelectedFile();
loadField.setText(f.getPath());
}
Run Code Online (Sandbox Code Playgroud)
我也试过做类似的事情,chooser.getCurrentDirectory()但这也不起作用.
编辑:使用Mac OS X,Java 1.6
向Swing Pros致以问候,这是一个很好的(我希望)问题.
以下是我看到的任务要求和可能的解决方案.我想有人有这样的铁杆经验来分享一些关于这个的想法.
这不需要编码或类似的东西,我只需要一般性建议,关于我需要使用驻留在sun.swing和/或javax.swing.plaf包中的私有符号的事实,哪种方法更可靠.
任务是修改/改变JFileChooser行为(实际上只是一点点).
当用户在文件名JTextField中按Enter键,并且该字段包含dir的路径时,不要"选择"目录,而是切换到它.是的,对话框配置为接受目录,但我们只需要接受"打开"按钮的点击,并且(可能)双击文件列表表.
通过在文件名文本字段中输入,阻止用户选择数据超过1GB的目录/文件
以下是一些常规解决方案选项:
一个.聆听JFileChooser提供的基于属性的更改(事后触发哪个AFAICS,并且不会提供我们需要的控制程度).
湾 修改javax.swing.plaf.basic.BasicFileChooserUI(通过refrection,打破私有级封装)并修改引用
private Action approveSelectionAction = new ApproveSelectionAction();
Run Code Online (Sandbox Code Playgroud)
这样我们的自定义操作就会对1和2进行额外检查.这种方法与plaf包链接,如果在此UI类下面的某个类中以某种方式覆盖此操作,则可能会失败.
C.遍历JFileChooser组件层次结构,找到JTextField(显然应该只在组件树中出现一次),使用我们的自定义检查装饰挂在JTextField上的所有动作侦听器.我的调试会话显示这个JTextField是生活在sun.swing.FilePane中的JTextField的一些匿名子类.这种方法似乎更友好,但是对于某些操作系统来说,这个文本字段可能不存在,或者其他一些JTextField也存在于层次结构中.
好吧,似乎公共JFileChooser API不足以实现这种行为,而其他两个选项要么是深度魔术还是不可移植(长期),要么两者兼而有之.
所以,问题是:你会选择哪种方法?为什么?
我正在使用JFileChooser作为JTable单元的编辑器.我希望用户使用JFileChooser选择一个有效的文件,然后当他们按Enter键时,文件路径将保存到单元格中.如果他们想要清除细胞,则会出现问题.所以我希望他们清除JFileChooser,然后用空字符串设置单元格(或者为null,无论哪个).
我的问题是,如果您没有选择文件,则无法按"批准"按钮.在我的代码中,"空!" 永远不会打印.有没有办法在没有选择文件时允许选择批准按钮?这是我尝试过的:
JFileChooser component = new JFileChooser(){
public void approveSelection(){
File f = getSelectedFile();
if(f==null){
System.out.println("empty!");
return;
}else{
if(!f.exists()){
System.out.println("does not exist!");
}else{
super.approveSelection();
}
}
}
};
Run Code Online (Sandbox Code Playgroud) 要在JFileChooser中浏览目录,用户可以使用双击.问题是,如果他们点击不够快,文件选择器认为他们想要编辑目录名称,这是非常烦人的.有没有办法禁用目录名称编辑?
在JFileChooser中对文件单击两次(而不是双击)时,可以重命名所选文件.如何禁用此功能?我试过了
UIManager.put("FileChooser.readOnly", Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我JFileChooser在Ubuntu 12.04下有问题.我使用此代码来设置外观:
javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
它看起来像这样.使用起来非常不舒服,看起来非常难看:
http://www9.picfront.org/token/9sRH/2012/05/15/2062476.jpg
我希望它看起来像这样:
http://www4.picfront.org/token/1lpa/2012/05/15/2062477.jpg
使用这篇文章中的提示,我尝试使用FileDialog而不是FileChooser.但是FileDialog当我在LOAD模式下启动并点击"打开"按钮时会引发异常.我创建对话框的方式:
FileDialog fd = new FileDialog(frame, "Test", FileDialog.LOAD);
fd.setVisible(true);
Run Code Online (Sandbox Code Playgroud)
例外情况:
Exception in thread "Thread-0" java.lang.NullPointerException
at sun.awt.X11.GtkFileDialogPeer.setFileInternal(GtkFileDialogPeer.java:79)
at sun.awt.X11.GtkFileDialogPeer.run(Native Method)
at sun.awt.X11.GtkFileDialogPeer.showNativeDialog(GtkFileDialogPeer.java:172)
at sun.awt.X11.GtkFileDialogPeer.access$000(GtkFileDialogPeer.java:39)
at sun.awt.X11.GtkFileDialogPeer$1.run(GtkFileDialogPeer.java:114)
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu Linux 12.04下使用Oracle JDK7和Gnome 3(如果这有帮助的话).
有没有人知道我怎么能改善外观JFileChooser或者FileDialog工作?
如何在JFileChooser中隐藏"可选文件过滤器小部件"?通过"可选文件过滤器小部件",我的意思是下面的面板包含单词"文件格式".

文档中有很多关于如何修改窗口小部件中显示的特定过滤器的信息,但我无法弄清楚如何完全隐藏它.
我正在使用JFileChooser来选择目录,因此小部件是不必要的.
有任何想法吗?
编辑
最后,我采用了Andrew Thompson的建议并设置过滤器选择器以显示文本"仅限目录".如果它可以帮助任何人,我使用以下代码:
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.setFileFilter( new FileFilter(){
@Override
public boolean accept(File f) {
return f.isDirectory();
}
@Override
public String getDescription() {
return "Directories only";
}
});
Run Code Online (Sandbox Code Playgroud) 我正在使用JFileChooser开发一个Java应用程序,用户可以切换语言.
Locale.setDefault( Locale.ENGLISH );
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog( null );
Locale.setDefault( Locale.CHINA );
JFileChooser.setDefaultLocale( Locale.CHINA );
JFileChooser chinese_chooser = new JFileChooser();
chinese_chooser.showOpenDialog( null );
Run Code Online (Sandbox Code Playgroud)
除了下拉框中的"所有文件"字符串外,要显示的第二个文件选择器是中文.如果我注释掉代码的第一部分,则文件选择器会正确显示所有已翻译的字符串.
这是java中的错误还是我需要在其他地方设置区域设置?
如何才能使翻译文件选择器正确显示?
在java中打开文件似乎有点棘手 - 为.txt文件必须与扫描仪或BufferedReader类对象一起使用File对象 - 图像IO,必须使用一个ImageIcon类 - 如果一个是从字面上打开从java开始.txt文件(类似于双击应用程序),这段代码似乎有效:
import java.io.*;
public class LiterallyOpenFile {
public static void main(String[] args) throws IOException {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("notepad Text.txt");
}
}
Run Code Online (Sandbox Code Playgroud)
我还不能肯定,但我认为其他文件类型/名称可以在EXEC后括号被取代 - 反正,我计划在JFileChooser打开某些文件,当用户点击一个文件打开(用户点击时在文件上,可以使用getSelectedFile()方法获取文件的路径.虽然我更具体地希望能够在java程序中打开Arduino IDE中的Arduino文件,比如模拟双击......也许是这样的?
import java.io.*;
public class LiterallyOpenFile {
public static void main(String[] args) throws IOException {
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("Arduino C:\\Arduino\\fibonacci_light\\fibonacci_light.ino");
}
}
Run Code Online (Sandbox Code Playgroud)
正确方向的一点将不胜感激.
我有一个关于JFileChooser的问题很长一段时间了,现在还没有找到帮助......问题是文件窗口没有显示出来.我试图找到这个问题的原因,我测试了以下内容:
public class Test {
public static void main (String[] args) {
load();
}
public static void load () {
String folder = System.getProperty("user.dir");
JFileChooser fc = new JFileChooser(folder);
int resultat = fc.showOpenDialog(null);
}
}
Run Code Online (Sandbox Code Playgroud)
运行此代码时,我会看到要显示的窗口.
但是,当我尝试这个:
public class Test {
public static void main (String[] args) {
String input = JOptionPane.showInputDialog(null, "Make your choice!\n" +
"1. load file");
load();
}
}
Run Code Online (Sandbox Code Playgroud)
然而,窗口没有显示,编程仍在运行...我不知道可能导致此问题的原因