Java JTabbedPane 获取组件

Java JTabbedPane get Components

我正在尝试更新我编写的程序的 GUI。在新的 GUI 上,我有一个 JFrame,它包含一个 JPanel,上面有一个 JTabbedPane 和两个按钮。

在 JTabbedPane 中,我有三个 JPanel,其中包含不同的组件。 (如按钮、文本字段等)所以现在我必须让所有组件根据类型对它们执行相同的操作。

例如。如果有一个文本框,我必须做一些事情,但如果有一个按钮,我必须做其他事情。

所以之前我做了这样的事情:

    Container focus = general_panel.getFocusCycleRootAncestor();
    FocusTraversalPolicy ftp = focus.getFocusTraversalPolicy();
    Component comp = ftp.getFirstComponent(general_panel);
    Component first = comp;
    while(comp != null){
       if(comp instanceof JComboBox){
           ((JComboBox) comp).setSelectedIndex(0);
       }
       ....

       comp = ftp.getComponentAfter(focus, comp);

       if(comp.equals(first)){
           break;
       }
    }

并且使用带有先前 GUI 的 JPanel 工作正常。 但是现在,与选项卡窗格相同的方法我只收到第一个组件和很多 "null" 而不是其他组件。

这是 System.out.pritnln(comp) 的结果,在选项卡窗格中有一个 Jpanel

javax.swing.JComboBox[,26,24,78x25,layout=javax.swing.plaf.basic.BasicComboBoxUI$Handler,alignmentX=0.0,alignmentY=0.0,border=com.bulenkov.darcula.ui.DarculaComboBoxUI@3b43d6ce,flags=328,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=Bianco]
null
null
null
null
null
null
null
null
null
null
null
null
null
null

"old" GUI 和新的 GUI 都是使用 NetBeans 中嵌入的 GUI 创建器完成的,所以可能所有组件的设置都是相同的..

但是 TabbedPane 内的面板的处理方式是否不同于 JPanel 而不是 JFrame?

以防万一有人遇到同样的情况,我用这个解决了:

在 GUI 内部 class 创建了一个带有面板的容器:

Container focus = pnl_generali.getFocusCycleRootAncestor();

然后下面的方法完成剩下的工作:

public static List<Component> getAllComponents(final Container c) {
        Component[] comps = c.getComponents();
        List<Component> compList = new ArrayList<Component>();
        for (Component comp : comps) {
          compList.add(comp);
          if (comp instanceof Container) {
            compList.addAll(getAllComponents((Container) comp));
          }


            if(comp instanceof JTextField){
                 System.out.println(comp);
            }

        }
        return compList;
    }