【发布时间】:2023-03-12 15:04:01
【问题描述】:
所以,我正在寻找一种按日期对 jFileChooser 进行排序的方法,我发现了这个讨论:Start a JFileChooser with files ordered by date
解决方案有效。虽然,这段代码让我感到困惑:
JTable table = SwingUtils.getDescendantsOfType(JTable.class, fileChooser).get(0);
我决定使用 println() 来检查表实例的类型,结果如下:sun.swing.FilePane$6...
这个 FilePane 引起了我的兴趣。于是,我决定去寻找 FilePane 的源代码,发现:http://www.docjar.com/html/api/sun/swing/FilePane.java.html
在源代码中,FilePane 没有扩展 JTable。不过,FilePane 将 JTable 作为组件。 FilePane 怎么可能转换成 JTable?
我查看了 SwingUtils 源代码,发现了一些 getDescendantsOfType() 方法的实现。
public static <T extends JComponent> List<T> getDescendantsOfType(
Class<T> clazz, Container container) {
return getDescendantsOfType(clazz, container, true);
}
public static <T extends JComponent> List<T> getDescendantsOfType(
Class<T> clazz, Container container, boolean nested) {
List<T> tList = new ArrayList<T>();
for (Component component : container.getComponents()) {
if (clazz.isAssignableFrom(component.getClass())) {
tList.add(clazz.cast(component));
}
if (nested || !clazz.isAssignableFrom(component.getClass())) {
tList.addAll(SwingUtils.<T>getDescendantsOfType(clazz,
(Container) component, nested));
}
}
return tList;
}
我尝试使用 cast 运算符将 FilePane 转换为 JTable,但没有成功。我对Class<T>类知之甚少,所以对这个类的方法不是很熟悉。
【问题讨论】: