在我的项目中,我在JFrame中有一个需要交换的JPanel(bottomPanel),所以我在bottomPanel上使用了CardLayout。
在我的父JFrame中,我基本上在一个方法(setBottomPanel)中获得了这个代码:
bottom.add(p.toString(),p);
bottomLayout.show(bottom, p.toString());
我在父JFrame的构造函数中调用它一次,它工作正常。但是,我将对此父JFrame的引用传递给其他JPanels,如果我在引用上调用setBottomPanel()它没有效果,则面板不会更改。
我确实使用了bottomLayout.next(bottom)
,这确实改变了面板,但是改为空面。
更新
它似乎正确加载,我将代码更改回调用next()
但正在传递的JPanel为空。这可能是因为我在JPPanel上使用了GridLayout并将其添加到bottomPanel中吗?我根本没有传递布局参考...
答案 0 :(得分:2)
您确定您提供的代码示例反映了您正在使用的源代码吗?因为,假设bottom
是JPanel
且p
是JComponent
,您对bottom.add
的调用应该传递组件,然后是布局约束:
bottom.add (p, p.toString());
当您从其他JPanels拨打setBottomPanel()
时,您是否再次将组件添加到bottom
,或者只是在新的时候添加它们?如果是前者,bottom
很可能不会被重新验证或重新绘制。从Java API:“如果已将组件添加到已显示的容器中,则必须在该容器上调用validate以显示新组件。”
答案 1 :(得分:0)
想出来:
问题是传递给方法的JPanel有一个GridLayout,并且元素被添加到布局中。一旦我改变了构建JPanel的方式,代码就可以正常工作了:)
谢谢!