2010-02-24 49 views
0

在我的项目中,我在JFrame中有一个需要交换的JPanel(bottomPanel),所以我在bottomPanel上使用CardLayout。CardLayout交换面板

在我父的JFrame我已经基本上得到这个代码的方法(setBottomPanel):

bottom.add(p.toString(),p); 
bottomLayout.show(bottom, p.toString()); 

我父的JFrame的构造函数调用它一次,它工作正常。但是,我将对此父JFrame的引用传递给其他JPanel,并且如果我在引用上调用setBottomPanel(),则它不起作用,面板不会更改。 我的确使用了bottomLayout.next(bottom),这确实改变了面板,但改为空的。

更新:

看来这是正确加载,我改变了代码回调用next()但正在传递中的JPanel是空的。这可能是因为我在被添加到bottomPanel的JPanel上使用GridLayout?我没有通过布局参考......

回答

0

想通了:

问题是,JPanel的传递给方法具有网格布局,并且元素被添加到布局。一旦我改变了构建JPanel的方式,代码就可以正常工作:)

谢谢!

2

您确定您提供的代码示例反映了您正在使用的源代码吗?因为,假设bottomJPanelpJComponent,你要bottom.add调用应通过该组件,然后布局约束:

bottom.add (p, p.toString()); 

当你调用从其他JPanels setBottomPanel(),你添加的组件bottom,或者你只是添加他们,如果他们是新的?如果是前者,那么bottom很可能不会被重新验证或重新绘制。来自Java API:“如果某个组件已添加到已显示的容器中,则必须在该容器上调用验证以显示新组件。”

+0

啊,是的,你说的add()的参数顺序是正确的 - 在我的源代码中它是正确的,谢谢。 我忘了添加,我的确在调用validate和repaint – amr 2010-02-24 14:55:20