2011-02-28 112 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