如何从容器CardLayout更新面板上的JPanel?
答案 0 :(得分:2)
使用show()
method.来自Java API:
使用addLayoutComponent翻转到使用指定名称添加到此布局的组件。如果不存在这样的组件,则没有任何反应。
CardLayout#first()
,next()
和previous()
做类似的事情。
有时候,当我像这样进行面板交换时(虽然不是我记得在CardLayout
上,但是因为我使用它已经有一段时间了),我还需要再次打包框架。如果这不起作用,您可以调用revalidate()
,这样可以让Swing知道该组件需要重新绘制。
您可能还想考虑使用tabbed pane,因为它会为您做很多事情;我开始尝试使用CardLayout
的项目,并决定使用选项卡式窗格。当然,取决于你想做什么。
答案 1 :(得分:1)
是否有动作侦测器或其他东西,我可以让它在该屏幕上重新加载/刷新我的数据?
假设您有一个为视图(面板)提供数据的模型,通常有两种方法:
安排您的模型扩展Observable
并将您的观点注册为Observer
。
安排您的模型管理EventListenerList
,实际上创建了您自己的模拟ActionEvent
。
在任何一种方法中,使用切换视图的控件的侦听器告诉模型更新其注册的观察者/侦听器。 How to Use CardLayout中的示例使用JComboBox
和itemStateChanged()
。还有其他讨论here。
答案 2 :(得分:0)
show()方法可以实现切换面板的技巧,但它不会“刷新”数据。是否有一个actionlistener或者我可以让它在屏幕上重新加载/刷新我的数据?
答案 3 :(得分:0)
是否有动作侦测器或 我可以拥有它的东西 在该屏幕上重新加载/刷新我的数据?
您可以使用AncestorListener。将组件添加到Container时会触发它。因此,当你交换卡片时,事件就会被触发。您需要将侦听器添加到添加到CardLayout的每个面板中:
CardLayout的另一个问题是面板在交换时不会获得焦点。我使用这种方法将焦点放在面板上。查看Card Layout Focus。
panel.addAncestorListener(...);