如何控制嵌套在JtabbedPane中的面板



我有一个包含多个JtabbedPanesMainJtabbedPane,每个JtabbedPanes包含多个面板。

我需要能够从MainJtabbedPane访问面板。

JTabbedPane[] components = (JTabbedPane[]) Main_Tabbed_Panel.getComponents();
for(int i=0; i<components.length;i++)
{
for(int j=0;j<components[i].getTabCount();j++)
{
.....
}
}

给出错误java.awt.component cannot be cast to javax.swing.JtabbedPane

JTabbedPane[] components = (JTabbedPane[]) Main_Tabbed_Panel.getComponents();

getComponents()方法返回一个Components数组。即使您知道所有组件都将是JTabbedPane的实例,也不能将它们强制转换为JTabbedPane。你需要构建你的代码,比如:

for(Component component: main_Tabbed_Panel.getComponents())
{
    if (component instanceof JTabbedPane)
    {
        JTabbedPane tabbePane = (JTabbedPane)component;
        // do something with the tabbed pane
    }
}

此外,请遵循Java命名约定。变量名称不应以大写字符开头。(即"Main_Tabbed_Pane不遵循惯例")。

(JTabbedPane[])转换为(Component[])。如果你将鼠标悬停在getComponents()方法上,你会看到它返回Component[]

如果你想将Component[]转换为JTabbedPane[],你需要手动完成,并确保在转换过程中检查错误(在将其添加到JTabbedPane[]之前,确保它是JTabbedPane)

JTabbedPane[] panes = convertComponents(getComponents());
private JTabbedPane[] convertComponents(Component[] comps) {
    JTabbedPane[] panes = comps.length > 0? new JTabbedPane[comps.length] : null;
    if(panes != null)
        for(int i = 0; i < panes.length; i++) {
            if(comps[i] instanceof JTabbedPane)
            panes[i] = (JTabbedPane) comps[i];
        }
    return panes;
}

尽管这不是最有效的,因为对于getComponents()中不是JTabbedPane的每个项目,JTabbedPane数组中都会有一个空位,然后您必须清理它。

JTabbedPane[] panes = comps.length > 0? new JTabbedPane[comps.length] : null;

这首先检查通过参数传递的Component[]是否有1个或多个空格。如果没有,就不要麻烦用实例初始化。

if(panes != null)

由于panes有可能初始化为null,我们在尝试使用它之前进行了大量检查

for(int i = 0; i < panes.length-1; i++) {

由于Component[] compsJTabbedPane[] panes的大小相同,所以使用哪种长度并不重要,只要我们知道循环多少次即可。

if(comps[i] instanceof JTabbedPane)

这就是我所说的"如果组件不是JTabbedPane,那么数组中就会有一个空空间"。这将在将它放入窗格数组之前检查它是否是JTabbedPane。如果没有,它将被完全忽略,并且panes中的空间将保留为空

循环完成后,它将返回我们刚刚制作的数组。

最新更新