1

JXDatePicker を拡張して、フォーカスを取得したときに開くようにしようとしています。成功せずに理解していることを示唆するものを検索しました。これを行うエレガントな方法はありますか?

4

2 に答える 2

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);

フォーカスを再度移動する際のポップアップの自動クローズが確実に機能しないため、2 つのタブが必要なため (理由がわからない)、あまり満足のいくものではありません。

于 2013-03-19T09:28:00.740 に答える