为什么componentShown()没有被调用?

7

我有一个CardDetailsPanel类,其中包含几个JLabelJTextField。这个类包含在一个AddCardsPanel中,并按以下方式初始化:

    cardDetailsPanel = new CardDetailsPanel(true);
    add(cardDetailsPanel, java.awt.BorderLayout.CENTER);

我还有一个包含指令的JLabel。 我想在CardDetailsPanel首次出现时和焦点切换到每个JTextField时更新此标签。 我发现addFocusListener()方法对后者有效。 但是,我的compenentShown()方法对前者无效:

    addComponentListener(new java.awt.event.ComponentAdapter() {
        public void componentShown(java.awt.event.ComponentEvent evt) {
            formComponentShown(evt);
        }
    });

(好的,我知道这很丑陋。它是由NetBeans生成的。)

private void formComponentShown(java.awt.event.ComponentEvent evt) {
    this.frame = (BaseballFrame) this.getParent().getParent().getParent().getParent().getParent().getParent();
}

噢,这样做甚至更加丑陋。我稍后会处理链式的getParent()调用。在这里,我想做其他的事情。

那么为什么我的侦听器没有被调用?我如何编写一个侦听器,每当我的CardDetailsPanel出现在屏幕上时执行一些操作?


2
我认为你会发现componentShown更相关于setVisible - MadProgrammer
1个回答

8

根据对话框焦点中描述的方法,使用AncestorListener

当一个JDialog(或者JFrame)可见时,默认情况下,焦点会放在第一个可获得焦点的组件上。有时您可能想要改变这种行为。明显的解决方案是在您希望接收到焦点的组件上调用requestFocusInWindow()方法。问题在于,这并不总是有效。

...

问题在于,除非已将组件添加到“已实现”对话框中,否则组件无法请求获取焦点。已实现的对话框基本上指表示底层操作系统上的对话框的同级组件中已添加了Swing JDialog。这发生在您在JDialog上调用pack()setVisible(true)方法时。

这就是祖先侦听器派上用场的地方。对于模态对话框中的组件,一旦组件变得可见和已实现且可获得焦点,它将被触发。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接