【问题标题】:Why sun.swing.FilePane can be casted to javax.swing.table?为什么 sun.swing.FilePane 可以强制转换为 javax.swing.table?
【发布时间】: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>类知之甚少,所以对这个类的方法不是很熟悉。

【问题讨论】:

    标签: java swing casting


    【解决方案1】:

    在源代码中,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()

    方法。

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

    【讨论】:

    • 感谢您指出内部类!我在浏览 FilePane 的源代码时没有注意内部类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2014-03-16
    • 2012-03-06
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多