Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 打开JXDatePicker以获得焦点_Java_Swing_Datepicker_Swingx_Jpopup - Fatal编程技术网

Java 打开JXDatePicker以获得焦点

Java 打开JXDatePicker以获得焦点,java,swing,datepicker,swingx,jpopup,Java,Swing,Datepicker,Swingx,Jpopup,我试图扩展JXDatePicker,以便它在获得焦点时打开。 我一直在寻找我能理解的建议,但没有成功。 有没有一种优雅的方法可以做到这一点呢?令人惊讶的是,这实际上是不可能的:-( 这一次,JXDatePicker本身没有api来显示/隐藏弹出窗口(只有BasicDatePickerUI有)。加上ui委托有一些内部魔法(读:hacks…cough),使得FocusListener比通常在复合组件中更难处理 要播放的片段: final JXDatePicker picker = new JXDat

我试图扩展JXDatePicker,以便它在获得焦点时打开。 我一直在寻找我能理解的建议,但没有成功。
有没有一种优雅的方法可以做到这一点呢?

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

这一次,JXDatePicker本身没有api来显示/隐藏弹出窗口(只有BasicDatePickerUI有)。加上ui委托有一些内部魔法(读:hacks…cough),使得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);
不太令人满意,因为在再次转移焦点时自动关闭弹出窗口不能可靠地工作,需要两个选项卡(不知道为什么)

我也有同样的问题。 这对我很有用:

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

与JSomething一样:不要扩展:-)与复合组件一样:注册低级侦听器必须在相关的子级上完成,而不是在父级上完成(与可编辑组合相同)。我对Java非常陌生。我在哪里可以得到这种建议。特别是为了找出为什么不应该扩展JSomething,这似乎是一个不错的主意,我一直在为许多其他组件这样做,并取得了明显的成功:-)我将面临什么样的灾难?@kleopatra aaaach请:-)这个答案并不是说用JXMonthPanel展示JXxxXxxPopup的动作:-)这是简单的OO基础知识:-)mKorbel eh。。你想告诉我什么?@kleopatra………:-)