2011-02-28 114 views
1

任何解决方法?为什么setJMenuBar()不会触发ContainerEvent?

myContainer.getContentPane().addContainerListener(new ContainerListener(){ 
    @Override public void componentAdded(ContainerEvent e) { 
     System.out.println(e.getChild().getClass().getName().toString()); 
}}); 
myContainer.add(new JPanel()); 
myContainer.setJMenuBar(new JMenuBar()); 

回答

1

JMenuBar不是内容窗格的一部分。

有关框架及其组件的结构信息,请参见Using Top Level Containers上的Swing教程部分。

在setJMenuBar()方法的实际代码是:

getRootPane().setMenuBar(menubar); 

所以我猜的ContainerListener需要被添加到根窗格。

编辑:

从教程链接,您可以看到,框架结构的样子:

  • 根窗格
    • 分层窗格
      • 菜单栏
      • 内容窗格

从代码我张贴,它看起来像菜单栏被添加到根窗格这就是为什么我建议增加容器的侦听器,以根窗格。但看起来你需要将ContainerListener添加到分层窗格中:

getLayeredPane().addContainerListener(new ContainerAdapter()... 
+0

感谢您的信息,我没有意识到它们的区别。如果您建议将myContainer.getContentPane()更改为myContainer.getRootPane()。addContainerListener(),则不起作用。但不错的猜测 – klonq 2011-03-01 12:39:51

+0

@klonq,请参阅编辑。 – camickr 2011-03-02 04:03:37