【问题标题】:Opening JXDatePicker on gaining focus打开 JXDatePicker 以获得焦点
【发布时间】:2013-03-18 20:27:12
【问题描述】:

我正在尝试扩展 JXDatePicker 以便它在获得焦点时打开。 搜索了提示我理解没有成功。 有没有一种优雅的方式来做到这一点?

【问题讨论】:

  • 与 JSomething 一样:不要扩展 :-) 与复合组件一样:注册低级侦听器必须在相关子级上完成,而不是父级(与可编辑组合相同) )
  • 我对 Java 还很陌生,有什么地方可以得到这种建议。特别是要找出为什么不应该扩展 JSomething,这似乎是一个好主意,我一直在为许多其他组件做这件事,并取得了明显的成功:-) 对我来说会有什么灾难?
  • @kleopatra aaaach 请 :-) 这个答案不是关于 Whats Action 显示 JXxxXxxPopup 和 JXMonthPanel :-)
  • 这是简单的 OO 基础知识 :-) @mKorbel ehh .. 想告诉我什么?
  • @kleopatra ...... :-)

标签: java swing datepicker swingx jpopup


【解决方案1】:

令人惊讶的是,这实际上是不可能的:-(

这一次,JXDatePicker 本身没有 api 来显示/隐藏弹出窗口(只有 BasicDatePickerUI 有)。再加上 ui 代表有一些内部魔法(阅读:hacks ...咳),这使得 FocusListener 比通常在复合组件中更难处理。

一个可以玩的 sn-p:

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 不能可靠地工作,需要两个选项卡(不知道为什么)

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 这对我有用:

    jXDatePicker.getEditor().addFocusListener(new FocusListener() {
        @Override
        public void focusGained(FocusEvent e) {
            BasicDatePickerUI pickerUI = (BasicDatePickerUI) jXDatePicker.getUI();
            if (!pickerUI.isPopupVisible() && e.getOppositeComponent() != getRootPane() && e.getOppositeComponent() != jXDatePicker.getMonthView()) {
                pickerUI.toggleShowPopup();
            }
        }
        @Override
        public void focusLost(FocusEvent e) {}
    });
    

    这段代码用于避免焦点问题:

     e.getOppositeComponent() != getRootPane()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多