2013-03-18 36 views
1

我想擴展JXDatePicker,以便它在獲得焦點時打開。 已搜索表明,我明白沒有成功。 有沒有一個這樣做的優雅方式?打開JXDatePicker獲取焦點

+0

一如既往與JSomething:不擴展:-)和往常一樣使用複合組件:必須完成註冊低級偵聽器在相關的孩子,而不是父母(與可編輯組合相同) – kleopatra 2013-03-18 22:59:06

+0

我對Java很新,有什麼地方可以得到這樣的建議。特別是要找出爲什麼不應該擴展一個JSomething,似乎是一個好主意,我一直在爲其他許多組件取得明顯的成功:-)我面前有什麼災難? – 2013-03-19 06:38:29

+0

@kleopatra aaaach please :-)這個答案不談論什麼行動顯示與JXMonthPanel的JXxxXxxPopup :-) – mKorbel 2013-03-19 08:20:47

回答

3

令人驚訝的是,這不是:-(

這一次真的可能,JXDatePicker本身沒有API來顯示/隱藏彈出(僅BasicDatePickerUI了)加上UI委託有一些內在的魔法(讀:黑客...咳),使一個的FocusListener更糟糕的處理比一般在複合組件

一起玩一個片段:

final JXDatePicker picker = new JXDatePicker(); 
FocusListener l = new FocusListener() { 

    @Override 
    public void focusGained(FocusEvent e) { 
     // no api on the picker, need to use the ui delegate 
     BasicDatePickerUI pickerUI = (BasicDatePickerUI) picker.getUI(); 
     if (!pickerUI.isPopupVisible()) { 
      pickerUI.toggleShowPopup(); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       // opening the popup moves the focus to ... ? 
       // need to grab it back onto the editor 
       picker.getEditor().requestFocusInWindow(); 
      } 
     }); 
    } 

    @Override 
    public void focusLost(FocusEvent e) { 
    } 
}; 
// need to register the listener on the editor 
picker.getEditor().addFocusListener(l); 
JComponent content = new JPanel(); 
content.add(new JButton("dummy")); 
content.add(picker); 

不是真的滿意,因爲彈出窗口自動關閉在轉化中的焦點out再次無法可靠地工作,需要兩個選項卡(不知道爲什麼)

+0

謝謝.......... :-) – mKorbel 2013-03-19 10:43:34