java - 为什么 setJMenuBar() 不触发 ContainerEvent?

标签 java swing

有什么解决办法吗?

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());

最佳答案

JMenuBar 不是内容 Pane 的一部分。

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

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

getRootPane().setMenuBar(menubar);

所以我猜测 ContainerListener 需要添加到根 Pane 中。

编辑:

从教程链接中您可以看到框架结构如下所示:

  • 根 Pane
    • 分层 Pane
      • 菜单栏
      • 内容 Pane

从我发布的代码来看,菜单栏似乎已添加到根 Pane ,这就是我建议将容器监听器添加到根 Pane 的原因。但是,您似乎需要将 ContainerListener 添加到分层 Pane :

getLayeredPane().addContainerListener(new ContainerAdapter()...

关于java - 为什么 setJMenuBar() 不触发 ContainerEvent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5147854/

相关文章:

java - log4j2 不写入文件

JavaFX VBox 调整大小

java - 在数据流运行程序中运行管道时有时会出现 IllegalStateException

Java GUI 在调整大小之前显示空白

Java swing 边框和 Boxlayout

java - 如何从远程桌面连接客户端查看 Java 线程。 Ctrl-break 不起作用

java - 在java中实现Pi算法

java - JSplitPane 未显示

java - KeyListener Java

java - 为什么java后台进程很慢?