6

我有一个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出现在屏幕上就会执行一些操作?

4

1 回答 1

8

使用对话框焦点AncestorListener中描述的。

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

...

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

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

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

于 2012-09-10T18:33:05.157 回答