2012-08-15 146 views
4

我有一个CardDetailsPanel类,其中包含几个JLabel s和JTextField s。在包含在AddCardsPanel和初始化为该类如下:为什么componentShown()未被调用?

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 2012-08-15 01:24:00

回答

6

按照dialog focus中所述使用。

当(对于这个问题或JFrame)一个JDialog变得可见,焦点被放置在默认情况下,第一可聚焦的组件上。有时候你想改变这种行为。显而易见的解决方案是在您希望获得焦点的组件上调用requestFocusInWindow()方法。问题在于这一直无法正常工作。

...

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

这就是祖先听者派上用场的地方。对于模态对话框中的组件,一旦该组件变为可见,它将被触发,并且实现为&可聚焦。

编辑: 上述意见适用于在任何摆动容器组件,包括的JFrame和JPanel

相关问题