按日期排序启动JFileChooser文件选择器

7
最近有一个问题问到:如何在详细视图中启动JFileChooser?,并且答案提供了一个很好的技巧来解决这个问题。
我想在此提高期望值:既然我现在知道如何在详细视图中打开JFileChooser,那么我也可以让它按日期排序文件吗? 我知道用户当然可以点击标题,但在代码中是否有一种方法可以实现这一点?
1个回答

7
我不知道有任何API可以做到这一点。以下代码找到文件选择器使用的表格,然后手动对日期列进行排序:
JFrame frame = new JFrame();
JFileChooser  fileChooser = new JFileChooser(".");
Action details = fileChooser.getActionMap().get("viewTypeDetails");
details.actionPerformed(null);

//  Find the JTable on the file chooser panel and manually do the sort

JTable table = SwingUtils.getDescendantsOfType(JTable.class, fileChooser).get(0);
table.getRowSorter().toggleSortOrder(3);

fileChooser.showOpenDialog(frame);

您还需要Darryl的Swing Utils类。

编辑:

显然,在下面的评论中建议更改了一些逻辑:

尝试:

JTable table = SwingUtils.getDescendantsOfType(JTable.class, fileChooser).get(0);
table.getModel().addTableModelListener( new TableModelListener()
{
    @Override
    public void tableChanged(TableModelEvent e)
    {
        table.getModel().removeTableModelListener(this);
        SwingUtilities.invokeLater( () -> table.getRowSorter().toggleSortOrder(3) );
    }
});

fileChooser.showOpenDialog(frame);

这将在事件分派线程(EDT)的末尾添加排序顺序的切换,因此它应该在JTable详细视图的默认行为之后执行。

不幸的是,由于DetailsTableRowSorter的更改,自Java 11起,此功能不再工作: https://github.com/openjdk/jdk/commit/458f8d25976b2d59b0c0b6cb89bbdadbbf9265eamodelStructureChanged() 调用了 setSortKeys(null) ,这将有效地删除任何排序,并且在列出文件列表时调用此回调,至少在 Linux 上是如此。 - Mingun
是的,它可以工作,但是: (1)在Linux上表格只有3列(缺少“Type”列),因此您应该在Linux上使用toggleSortOrder(2); (2)它始终从升序开始。 - Mingun
将toggleSortOrder行重复,以按降序开始。 - Luciano Gonçalves

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