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