为什么不调用componentShown()?

Cod*_*ice 4 java events swing listener

我有一个CardDetailsPanel包含几个JLabels和JTextFields的类.该类包含在a中AddCardsPanel并初始化如下:

    cardDetailsPanel = new CardDetailsPanel(true);
    add(cardDetailsPanel, java.awt.BorderLayout.CENTER);
Run Code Online (Sandbox Code Playgroud)

我也有一个JLabel包含说明.我希望在第CardDetailsPanel一次出现时以及焦点更改为每个标签时更新此标签JTextField.我找到了addFocusListener()适用于后者的方法.但是,我的compenentShown()方法不适用于前者:

    addComponentListener(new java.awt.event.ComponentAdapter() {
        public void componentShown(java.awt.event.ComponentEvent evt) {
            formComponentShown(evt);
        }
    });
Run Code Online (Sandbox Code Playgroud)

(好吧,我知道这很难看.它是由NetBeans生成的.)

private void formComponentShown(java.awt.event.ComponentEvent evt) {
    this.frame = (BaseballFrame) this.getParent().getParent().getParent().getParent().getParent().getParent();
}
Run Code Online (Sandbox Code Playgroud)

(是的,这甚至更加丑陋.我稍后会处理链接的getParent()电话.我也想在这里做其他事情.)

那么为什么我的听众不会被召唤?如何在我CardDetailsPanel出现在屏幕上时编写一个会执行某些操作的侦听器?

And*_*son 7

使用对话框焦点中AncestorListener描述的内容.

当a JDialog(或JFrame为此)可见时,默认情况下焦点放在第一个可聚焦组件上.有时您可能希望更改此行为.显而易见的解决方案是requestFocusInWindow()在您希望获得焦点的组件上调用该方法.问题是这不会一直有效.

...

问题是..除非已将组件添加到"已实现"对话框中,否则组件无法请求焦点.实现的对话框基本上意味着已将Swing JDialog添加到表示底层OS上的对话框的对等组件.当您调用pack()setVisible(true)上的方法时会发生这种情况JDialog.

这就是祖先听众派上用场的地方.对于模态对话框中的组件,一旦组件变得可见,它就会被触发,并且可以实现和聚焦.

编辑: 以上注释适用于任何Swing容器中的组件,包括JFrame和JPanel.