Java JFilechooser

4
我希望能够控制JFileChooser的外观。特别是我希望可以保存上次显示JFileChooser时的显示方式。我想要保存使用详细信息/列表视图以及已排序的列(例如大小或修改日期)。

我知道有很多关于JFileChooser的问题,但我没有找到我想要的答案。

谢谢。

编辑:有人建议保留文件选择器的引用,但这并不足够,因为我希望在运行应用程序的许多次中持久保存设置。

编辑:例如,我通常想要打开我下载的最近文件,因此我想按修改日期排序并以详细视图显示。


"因此它不能在最近列表中。" 我不理解那个评论。当文件第一次被导入/打开时,可以将其添加到最近文件列表中。 - Andrew Thompson
我通常将附件保存到同一个文件夹中。当我导入到我的应用程序时,我已经默认打开了该文件夹,但我希望文件选择器以详细视图显示该文件夹,并按修改日期排序。 - Leon
我仍然不太明白你所说的任何内容如何比“最近文件”列表更简单,但如果你必须这样做,我建议完全绕过JFileChooser并开发一个自定义文件选择器,允许存储您想要的详细信息。您可能需要从文件浏览器GUI中显示的代码开始该过程。 - Andrew Thompson
这只是一个应用程序,但保存文件选择器的状态可能有其他用途,例如您的操作系统中的文件浏览器会存储您在文件夹中的视图以及项目的存储方式。 - Leon
@AndrewThompson 让我们在聊天室里继续这个讨论 - Leon
显示剩余3条评论
3个回答

2
如何进行对象序列化?您可以将JFileChooser对象持久化到文件中,以后可以检索它。

+1 这是一个更快的表达方式,而且也更早! - Andrew Thompson
我实现了序列化并尝试了安德鲁的版本。这种方法可以保存所选文件夹和所选文件,但不能保存排序顺序和详细视图。 - Leon

2
保持对它的引用,并仅构造一次。它应该在后续打开时看起来与用户处理时几乎相同。您需要采取额外措施来恢复文件选择器的位置。

运行间持久化。

有许多存储数据的方法(例如属性文件、XML、Preferences等)。这是实现它的快速而简单的方法。

import java.awt.event.*;
import javax.swing.*;
import java.io.*;

class SerializeMyChooser {

    static private JFileChooser fileChooser;
    static File serializedChooser = new File("chooser.ser");

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                final JButton showChooser = new JButton("Open File");
                showChooser.addActionListener( new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        if (fileChooser==null) {
                            if (serializedChooser.exists()) {
                                // use the resialized form
                                try {
                                    ObjectInputStream ois = new ObjectInputStream(
                                        new FileInputStream(serializedChooser));
                                    fileChooser = (JFileChooser)ois.readObject();
                                    ois.close();
                                } catch(Exception e) {
                                    // something SNAFU - use fall-back
                                    fileChooser = new JFileChooser();
                                    // configure file chooser..
                                }
                            } else {
                                fileChooser = new JFileChooser();
                                // configure file chooser..
                            }
                        }
                        fileChooser.showOpenDialog(showChooser);
                    }
                });

                JOptionPane.showMessageDialog(null, showChooser);

                if (fileChooser!=null) {
                    try {
                        ObjectOutputStream oos = new ObjectOutputStream(
                            new FileOutputStream(serializedChooser));
                        oos.writeObject(fileChooser);
                        oos.flush();
                        oos.close();
                    } catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}

正确的I/O和异常处理留给用户自行处理。


1
感谢您的回答,但这还不够,因为我希望设置在应用程序运行期间保持不变。我将编辑问题。 - Leon
谢谢Andrew。我一直在遵循MSK的建议并自己实现。这是一个巨大的努力。使用您的版本和我的版本,我们得到了相同的结果。文件夹和所选文件都被记住了,但是按修改日期排序和详细视图没有保存。我真的想保存排序顺序和详细视图。 - Leon
我的错。我只测试了保留当前目录的功能。:( - Andrew Thompson
没关系。我感谢你的努力。我可以在不进行序列化的情况下提取文件夹和文件。序列化也可以保存滑块位置,但不是我想要的功能。 - Leon
@Andrew Thompson,我知道这只是一个例子,但所有的流对象都必须在finally块中关闭,+1。 - mKorbel
@mKorbel,你注意到我上一句“不是我的问题”了吗? ;) - Andrew Thompson

1

很遗憾,你想要做的事情并不简单。虽然应该是这样,但它并没有被实现。目录的显示和排序是 LAF 的一部分。获得你想要的行为的唯一方法是通过实现自己的 BasicFileChooserUI,覆盖 create/getModel 并提供 BasicDirectoryModel 的实现。BasicDirectoryModel 的 sort 方法是实际执行排序的地方。

我听说过 XFileDialog 的赞誉,但我自己还没有尝试过。这是需要调查的事情,记住它只适用于 Windows(在 OSX 或 Linux 上回退到 JFileChooser)。


+1. 我完全同意。这应该很简单。我回家后会考虑你的建议。 - Leon
我尝试过,但无法实现。我创建了一个新的问题http://stackoverflow.com/questions/6874181/java-jfilechooser-customization以保持清晰度。 - Leon

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