为什么可以将 sun.swing.FilePane 强制转换为 javax.swing.table?

所以,我一直在寻找一种按日期对 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;
   }

我尝试使用强制转换运算符将 FilePane 强制转换为 JTable,但没有成功。我对 Class<T> 类知之甚少,所以我对这个类的方法不是很熟悉。

yanglu06550132 回答:为什么可以将 sun.swing.FilePane 强制转换为 javax.swing.table?

在源代码中,FilePane 没有扩展 JTable。

正确。

如何将 FilePane 转换为 JTable?

不能。

sun.swing.FilePane$6...

$6 表示它是 FilePane 类中定义的内部类。

内部类名称从 $1 开始,每个内部类都会增加。

从课堂上你可以看到:

 final JTable detailsTable = new JTable(getDetailsTableModel()) {
       // Handle Escape key events here
       protected boolean processKeyBinding(KeyStroke ks,KeyEvent e,int condition,boolean pressed) {
           if (e.getKeyCode() == KeyEvent.VK_ESCAPE && getCellEditor() == null) {
               // We are not editing,forward to filechooser.
               chooser.dispatchEvent(e);
               return true;
           }
           return super.processKeyBinding(ks,e,condition,pressed);
       }
   
       public void tableChanged(TableModelEvent e) {
           super.tableChanged(e);
   
           if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
               // update header with possibly changed column set
               updateDetailsColumnModel(this);
           }
       }
   };

可以看到 JTable 内部类覆盖了:

  1. processKeyBinding() 和
  2. tableChanged()

方法。

在编译源代码和使用内部类时,您应该能够看到内部类文件。

本文链接:https://www.f2er.com/377.html

大家都在问