如何在JFileChooser Swing组件中列出最近使用的文件

时间:2014-07-31 05:18:21

标签: java swing list jfilechooser

我在Java Project中使用 javax.swing.JFileChooser swing组件来打开文件对话框。如何列出最近使用的文件以便在JFileChooser中进行选择。每次我进入目录并选择耗时的文件。

如何在组件本身中列出最近几个最近使用的文件,以便我们不需要一次又一次地浏览目录以选择文件?

2 个答案:

答案 0 :(得分:4)

JFileChooser允许您提供accessory Component,该JFileChooser JList已添加到Windows右侧的ListModel组件中。

你能做的是......

  • 创建JListJFileChoosers,将accessory设置为JScrollPane Set(将其包装在JFileChooser中)
  • 每次选择文件时,请将其添加到JList
  • 每次您打开Set时,请使用Set中的值更新JFileChoosers模型(或使用{{1}返回模型})。
  • 每次用户从列表中选择一个值时,您都需要更改selectedFile import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileSystemView; public class TestFileChooser { public static void main(String[] args) { new TestFileChooser(); } public TestFileChooser() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JFileChooser fc; private RectentFileList rectentFileList; public TestPane() { setLayout(new GridBagLayout()); JButton chooser = new JButton("Choose"); chooser.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (fc == null) { fc = new JFileChooser(); rectentFileList = new RectentFileList(fc); fc.setAccessory(rectentFileList); fc.setFileSelectionMode(JFileChooser.FILES_ONLY); } switch (fc.showOpenDialog(TestPane.this)) { case JOptionPane.OK_OPTION: File file = fc.getSelectedFile(); rectentFileList.add(file); break; } } }); add(chooser); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } public class RectentFileList extends JPanel { private final JList<File> list; private final FileListModel listModel; private final JFileChooser fileChooser; public RectentFileList(JFileChooser chooser) { fileChooser = chooser; listModel = new FileListModel(); list = new JList<>(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setCellRenderer(new FileListCellRenderer()); setLayout(new BorderLayout()); add(new JScrollPane(list)); list.addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (!e.getValueIsAdjusting()) { File file = list.getSelectedValue(); // You might like to check to see if the file still exists... fileChooser.setSelectedFile(file); } } }); } public void clearList() { listModel.clear(); } public void add(File file) { listModel.add(file); } public class FileListModel extends AbstractListModel<File> { private List<File> files; public FileListModel() { files = new ArrayList<>(); } public void add(File file) { if (!files.contains(file)) { if (files.isEmpty()) { files.add(file); } else { files.add(0, file); } fireIntervalAdded(this, 0, 0); } } public void clear() { int size = files.size() - 1; if (size >= 0) { files.clear(); fireIntervalRemoved(this, 0, size); } } @Override public int getSize() { return files.size(); } @Override public File getElementAt(int index) { return files.get(index); } } public class FileListCellRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof File) { File file = (File) value; Icon ico = FileSystemView.getFileSystemView().getSystemIcon(file); setIcon(ico); setToolTipText(file.getParent()); setText(file.getName()); } return this; } } } } 属性以反映更改...

有关详细信息,请查看Providing an Accessory Component了解详情......

<强>更新

Example

Preferences

持久性问题是一个广泛的问题,可以归结为您的个人需求,例如,您可以将文件列表转储到平面文件中,这可能是最简单的解决方案,因为这意味着您可以简单地阅读文件从头到尾,知道你有完整的内容。此外,再次写出文件将覆盖任何以前的值,使其易于管理。

其他解决方案可能需要提供&#34;计数&#34;属性,然后您将后缀为已知键以列出值,这将需要在更新详细信息时手动删除旧值。您还可以尝试使用分隔符将所有值保存为持久性存储中的单个值,但这会导致选择不会在文件名中使用的分隔符(路径分隔符可能执行的操作:D) )

请查看How can I save the state of my program and then load it?了解更多想法......

<强>更新

经过一番考虑后,您可以使用File.pathSeparator API使用StringBuilder sb = new StringBuilder(128); for (int index = 0; index < listModel.getSize(); index++) { File file = listModel.getElementAt(index); if (sb.length() > 0) { sb.append(File.pathSeparator); } sb.append(file.getPath()); } System.out.println(sb.toString()); Preferences p = Preferences.userNodeForPackage(TestFileChooser.class); p.put("RectentFileList.fileList", sb.toString()); 使用单个密钥存储文件列表,因为这应该是唯一的,不会被文件名/使用路径。

例如,您可以使用类似......

之类的内容保存列表
Preferences p = Preferences.userNodeForPackage(TestFileChooser.class);
String listOfFiles = p.get("RectentFileList.fileList", null);
if (listOfFiles != null) {
    String[] files = listOfFiles.split(File.pathSeparator);
    for (String fileRef : files) {
        File file = new File(fileRef);
        if (file.exists()) {
            add(file);
        }
    }
}

然后再使用类似的东西加载它

{{1}}

答案 1 :(得分:1)

Use setSelectedFile(File file) method of JFileChooser.

医生说:

public void setSelectedFile(File file)
  

设置所选文件。如果文件的父目录不是   当前目录,将当前目录更改为文件   父目录。

<强> This links may be helpful

example by peeskillet