在CardLayout交换上刷新面板

时间:2010-07-30 15:33:47

标签: java swing

如何从容器CardLayout更新面板上的JPanel?

4 个答案:

答案 0 :(得分:2)

使用show() method.来自Java API:

使用addLayoutComponent翻转到使用指定名称添加到此布局的组件。如果不存在这样的组件,则没有任何反应。

CardLayout#first()next()previous()做类似的事情。

有时候,当我像这样进行面板交换时(虽然不是我记得在CardLayout上,但是因为我使用它已经有一段时间了),我还需要再次打包框架。如果这不起作用,您可以调用revalidate(),这样可以让Swing知道该组件需要重新绘制。

您可能还想考虑使用tabbed pane,因为它会为您做很多事情;我开始尝试使用CardLayout的项目,并决定使用选项卡式窗格。当然,取决于你想做什么。

答案 1 :(得分:1)

  

是否有动作侦测器或其他东西,我可以让它在该屏幕上重新加载/刷新我的数据?

假设您有一个为视图(面板)提供数据的模型,通常有两种方法:

  1. 安排您的模型扩展Observable并将您的观点注册为Observer

  2. 安排您的模型管理EventListenerList,实际上创建了您自己的模拟ActionEvent

  3. 在任何一种方法中,使用切换视图的控件的侦听器告诉模型更新其注册的观察者/侦听器。 How to Use CardLayout中的示例使用JComboBoxitemStateChanged()。还有其他讨论here

答案 2 :(得分:0)

show()方法可以实现切换面板的技巧,但它不会“刷新”数据。是否有一个actionlistener或者我可以让它在屏幕上重新加载/刷新我的数据?

答案 3 :(得分:0)

  

是否有动作侦测器或   我可以拥有它的东西   在该屏幕上重新加载/刷新我的数据?

您可以使用AncestorListener。将组件添加到Container时会触发它。因此,当你交换卡片时,事件就会被触发。您需要将侦听器添加到添加到CardLayout的每个面板中:

CardLayout的另一个问题是面板在交换时不会获得焦点。我使用这种方法将焦点放在面板上。查看Card Layout Focus

panel.addAncestorListener(...);