2012-03-28 42 views
0

我有一個兩個表格JTextField s:text1text2檢查哪個JTextField將獲得焦點

每個文本字段都有一個焦點偵聽器,我正在偵聽text1和text2上的focusLost()

重點遍歷是text1 - > text2

當焦點從text2中丟失時,text1和text2被處理,然後被清除,然後焦點再次被設置爲text1。

在文本2,這是我的自定義焦點監聽器:

private class Text2FocusListener implements FocusListener{ 
    @Override 
    public void focusLost(FocusEvent arg0){ 
    if(arg0.isTemporary()){ 
     return; 
    } 
    process_input... 
    } 
} 

問題是,如果用戶需要點擊(通過鼠標或鍵盤)回到文本1(即需要在文本1場來校正數據),焦點從text2中丟失,並處理來自text1和text2的輸入。

if子句中,我需要以某種方式檢查焦點是要去text1,我不知道如何。

有人處理過類似的問題嗎?

+1

這_if clause_ - 沒有看到任何在你的代碼段;-)或者換句話說:爲更好地幫助更快,顯示SSCCE這表明你是什麼之後以及你的期望沒有得到滿足。 – kleopatra 2012-03-28 11:30:06

+0

if(arg0.isTemporary())... – 1ac0 2012-03-29 05:44:25

+0

darn ..對於if是盲目的;-)但仍然沒有看到任何SSCCE,我又瞎了? – kleopatra 2012-03-29 09:46:45

回答

2
  1. 對焦/ FocusSubsystem是相當 - 異步,您必須包裝rellated代碼爲invokeLater

  2. FocusListener可能造成的問題的情況下與其他聽衆一起加入到JTextComponents,例如FocusListenerItemListener加入(編輯)JComboBox造成end_less循環,或與Caret一起DocumentListener太STANGE行爲,

  3. 刪除這些監聽器上focusLost

  4. focusGained所有代碼結束之後僅添加需要監聽器

  5. 爲什麼你需要的原因FocusListener,也許有兩個更好的選擇,但沒有從你的問題清楚,編輯你的問題SSCCE

+0

廣告1:是的,處理代碼在invokeLater()中,但這與問題無關。 – 1ac0 2012-03-28 11:03:52

+0

廣告2:只有這一個聽衆在JTextField上,我知道這個問題,它與問題無關 廣告3:效果很好 廣告5:沒有找到,輸入必須在上次輸入焦點丟失後驗證(「text2」字段) ad 4:hmm,如果我在「text2」字段之後放置僅1像素寬的組件,它將成爲焦點遍歷上的下一個組件,而不是在text2之後處理「text1」和「text2」失去了重點,如果用戶點擊回到「text1」項目,處理代碼將不會處理。將嘗試,看起來不錯.. – 1ac0 2012-03-28 11:10:05

+0

這是學術答案,我的學者點,也許有另一種方式,編輯您的問題與SSCCE, – mKorbel 2012-03-28 11:12:01

1

FocusEventpublic Component getOppositeComponent()方法

+1

經過一番闡述,我要回答自己:這是不可能的。事實上,我可以'MyFocusTraversalPolicy擴展可以實現的FocusTraversalPolicy'類,並通過'getComponentAfter()'請求下一個組件,但這與問題「哪個組件將在現實中有焦點無關」。是的,我可以問'MyFocusTraversalPolicy'哪個組件位於組件之前或之前,但是在組件失去焦點之後,沒有辦法找出真正的哪個組件會獲得焦點(我可以通過鼠標點擊組件在MyFocusTraversalPolicy中的順序)。 – 1ac0 2012-04-17 11:50:37