2012-08-15 60 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

相關問題