【问题标题】:Why is componentShown() not called?为什么没有调用 componentShown()?
【发布时间】:2012-08-11 08:45:08
【问题描述】:

我有一个CardDetailsPanel 类,其中包含几个JLabels 和JTextFields。此类包含在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 出现在屏幕上,它就会执行一些操作?

【问题讨论】:

  • 我想你会发现componentShownsetVisible 的关系更大

标签: java swing events listener


【解决方案1】:

使用AncestorListener,如dialog focus 中所述。

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

...

问题是......一个组件不能请求焦点,除非它被添加到一个“实现”的对话框中。实现的对话框基本上意味着 Swing JDialog 已添加到代表底层操作系统上的对话框的对等组件中。当您在 JDialog 上调用 pack()setVisible(true) 方法时会发生这种情况。

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

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

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2011-10-27
    • 2020-07-19
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多