【发布时间】:2012-04-07 02:13:38
【问题描述】:
女士们,先生们,晚上好,
我有一个无法解决的 Java Swing 问题,也许你可以帮助我。这里是:
- 我有一个使用 BorderLayout 的 JFrame 和许多 JPanel。
- 每次我需要建立一个新屏幕(即从主菜单,当单击搜索按钮时,转到搜索菜单),我只需删除位于中心的组件(JPanel),然后将而是在中心的新屏幕(新 JPanel)。
- 这样,每次我想建立一个新屏幕时,我就不会调用我所有的页眉和页脚对象。
除了这个小问题之外,这个系统一切正常:我想在每次创建新的 JPanel 或更改回现有的 JPanel 时触发一些方法(一般来说,每次出现 JPanel 时)。
为了做到这一点,我尝试实现 ComponentListener 的 componentShown(ComponentEvent e) 方法,并将 ComponentListener 添加到我放在 JFrame 中心的 JPanel 中,但它不起作用。在此之后,我做了一些研究,发现这个 componentShown (@ComponentListener) 方法仅在 JPanel 的可见性发生变化(从不可见到可见或相反)时才有效。不幸的是,我没有改变 JPanel 的可见性,只是用另一个替换它:删除当前的,然后添加新的。下面的代码说明了我如何替换 JPanel。
// Get the JPanel located in the center of our JFrame
JPanel currentView = (JPanel) myFrame.getContentPane().getComponent( 2 );
if ( currentView != null )
{
// Remove it from the JPanel
myFrame.getContentPane().remove( currentView );
}
// Add the new JPanel
myFrame.getContentPane().add( otherView, BorderLayout.CENTER );
// Pack the JFrame and show it
myFrame.pack();
这就是我所拥有的。如果您能帮助我,我将不胜感激。
【问题讨论】:
-
除了自己添加/删除
JPanels 之外,您还可以在contentPane的CENTER中使用JPanel和CardLayout。 How to useCardLayout. -
@Jeffrey,感谢您的快速响应。你说的很好,很合理,但我正在处理的是一个小组工作。我们有一个我们现在正在遵循的模式,在建议改变我们的模式(BorderLayout --> CardLayout)之前,我想 - 至少 - 尝试用当前模式提出一个解决方案。
-
您使用 BorderLayout 并不意味着您也不能使用 CardLayout,因为它们不是互斥的。 BorderLayout.CENTER 面板可以是持卡人,使用 CardLayout 的 JPanel。
-
我不认为我理解你的问题。您有从一个面板切换到另一个面板的代码,并且您正在询问切换面板后如何做一些额外的事情......为什么不简单地在调用
add方法后添加代码而不是尝试使用侦听器?跨度> -
直观的“可见性”通知通过 AncestorListener 发生:docs.oracle.com/javase/7/docs/api/javax/swing/event/…
标签: java swing event-handling jpanel event-listener