我有一个包含多个JtabbedPanes
的MainJtabbedPane
,每个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[] comps
和JTabbedPane[] panes
的大小相同,所以使用哪种长度并不重要,只要我们知道循环多少次即可。
if(comps[i] instanceof JTabbedPane)
这就是我所说的"如果组件不是JTabbedPane
,那么数组中就会有一个空空间"。这将在将它放入窗格数组之前检查它是否是JTabbedPane
。如果没有,它将被完全忽略,并且panes
中的空间将保留为空
循环完成后,它将返回我们刚刚制作的数组。