我有一个包含一些JInternalFrames的JDesktopPane。我希望菜单栏上的一些菜单仅在其中一个JInternalFrames被选中时才被激活。我尝试过使用VetoableChangeListener,其中包含以下代码:
JInternalFrame selectedFrame = desk.getSelectedFrame();
if ((selectedFrame != null)) {
imageMenu.setEnabled(Boolean.TRUE);
} else {
imageMenu.setEnabled(Boolean.FALSE);
}但结果并不是我所期望的--例如,菜单只有在我第二次添加框架时才会启用。当我关闭所有框架时,它仍然处于启用状态。
我怎么才能让它工作呢?
发布于 2011-08-28 17:00:11
您必须阅读具有InternalFrameListener链接JInternalFrames的基本教程,
但另一种看起来更好的方法是通过编程在所有情况下和每一次都知道这些事件是通过添加PropertyChangeListener,如示例Getting All Frames in a JDesktopPane Container所示,通过添加PropertyChangeListener,您可以为these events侦听
发布于 2011-08-28 17:06:29
当JInternalFrame获得focus (isActivated)时,我会直接使用create a custom event and fire it。菜单项将侦听此事件,截获它,并相应地设置其状态为启用或禁用。这样做的好处是,您不必处理哪些菜单项应用于哪些类型的内部框架,只需触发相应的事件即可。如果你在将来添加更多的内部框架,你的生活会变得更容易。
发布于 2011-08-28 17:07:39
将InternalFrameListener添加到添加到桌面窗格的每个内部框架,并在每次触发事件时执行问题中显示的代码。
不过,下面的代码可以写得更好:
setEnabled接受原始布尔值作为参数,而不是java.lang.Boolean。使用true和false而不是Boolean.TRUE,并且Boolean.TRUE表达式(selectedFrame != null)的计算结果为布尔值。只需编写即可
imageMenu.setEnabled(selectedFrame != null);
而不是
if ((selectedFrame != null)) {
imageMenu.setEnabled(Boolean.TRUE);
} else {
imageMenu.setEnabled(Boolean.FALSE);
}https://stackoverflow.com/questions/7219860
复制相似问题