我希望能够控制JFileChooser的外观。特别是,我想保存JFileChooser上次显示时的显示方式。我想保存它是否在细节/列表视图中使用,以及哪些列(例如,大小或日期修改)列表被排序。
我知道有很多关于JFileChooser的问题,但是我一直找不到我想要的东西。
谢谢
编辑:它被建议作为一个答案,但是保持对文件回波器的引用是不够的,因为我想在运行应用程序的过程中多次保存这些设置。
编辑:例如,我通常希望打开我下载的最新文件,所以我想按日期排序,修改后显示详细视图。
发布于 2011-07-28 12:57:42
保持对它的引用,并且只构造一次。它应该在随后的情况下打开,看起来很像用户处理它时的样子。您需要采取额外的步骤来恢复文件选择器的位置。
在两次跑步之间坚持。
在运行之间有多种存储数据的方法(例如,属性文件、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 &异常处理是留给用户的练习。
发布于 2011-07-28 13:08:12
对象序列化如何?您可以将JFileChooser对象持久化到文件中,然后再检索它。
发布于 2011-07-29 03:18:18
不幸的是,你想要做的事情并不是微不足道的。应该是这样的,但它不是那样实现的。目录和排序的显示是LAF的一部分。获得所需行为的唯一方法是实现自己的BasicFileChooserUI、覆盖create/getModel和提供BasicDirectoryModel的实现。BasicDirectoryModel的排序方法是实际执行排序的地方。
我听说过对XFileDialog的赞扬,但我自己还没试过。这是值得研究的事情,请记住,它是Windows专用的(回到OSX或Linux上的JFileChooser )。
https://stackoverflow.com/questions/6859225
复制相似问题