Java 第一次设置日期时出现JDatePicker错误

Java 第一次设置日期时出现JDatePicker错误,java,swing,Java,Swing,JDatePicker是一个用于选择日期的开源JavaGUI组件 当我将二月设置为创建组件后的一个月时,似乎有一个bug。所有其他月份都正常工作 package jat.examples.DatePicker; import jat.jdatepicker.JDateComponentFactory; import jat.jdatepicker.JDatePicker; import javax.swing.JApplet; import javax.swing.JComponent;

JDatePicker是一个用于选择日期的开源JavaGUI组件

当我将二月设置为创建组件后的一个月时,似乎有一个bug。所有其他月份都正常工作

package jat.examples.DatePicker;

import jat.jdatepicker.JDateComponentFactory;
import jat.jdatepicker.JDatePicker;

import javax.swing.JApplet;
import javax.swing.JComponent;

public class DatePickerExample extends JApplet{

private static final long serialVersionUID = 1920676464239324135L;
JDatePicker depart_date_picker;

public void init() {
    depart_date_picker = JDateComponentFactory.createJDatePicker();
    depart_date_picker.setTextEditable(true);
    depart_date_picker.setShowYearButtons(true);

    add((JComponent) depart_date_picker);

}

public void start() {

    depart_date_picker.getModel().setYear(2010);
    depart_date_picker.getModel().setMonth(1);
    //depart_date_picker.getModel().setMonth(1);
    depart_date_picker.getModel().setDay(15);
    depart_date_picker.getModel().setSelected(true);    
}

}
它显示的不是二月,而是三月

在调试器中,我注意到oldValue为null

public void setMonth(int month) {
    int oldMonthValue = this.calendarValue.get(Calendar.MONTH);
    T oldValue = getValue();
    calendarValue.set(Calendar.MONTH, month);
    fireChangeEvent();
    firePropertyChange("month", oldMonthValue, this.calendarValue.get(Calendar.MONTH));
    firePropertyChange("value", oldValue, getValue());
}
果然,当我两次调用该方法时,它正确地显示了

    depart_date_picker.getModel().setMonth(1);
    depart_date_picker.getModel().setMonth(1);

可能是变量初始化问题。我是对的,有人能解决这个问题吗?或者我使用库的方式不正确吗?

我注意到您的包导入是jat.jdatepicker.jdatepicker,它似乎直接包含在的源repo中

您正在使用的这个版本的JDatePicker是来自原始JDatePicker项目的分支。尽管开源项目不允许使用fork,但如果有需要解决的问题,建议尝试并提交回原始项目

我建议您最好使用最新版本的项目

我针对jdatepicker-1.3.4测试了您的案例,它可以从中央存储库()下载

将其包含在maven中:

<dependency>
    <groupId>org.jdatepicker</groupId>
    <artifactId>jdatepicker</artifactId>
    <version>1.3.4</version>
</dependency>

这可能取决于测试运行的时间。我注意到你在接近一个月底的时候问了这个问题。二月只有28天

我怀疑发生的是您在本月29日、30日或31日运行了代码,所以最初的选择是2012-11-30。当您将月份值设置为01(2月)时,日期值保持在30,从而产生一个“非规范化”日期,当
日历
尝试从字段值确定实际日期时,该日期将滚动到下一个月。比如在进行十进制加法时“携带”溢出。这会给你一个像3月1日这样的日期。然后,如果您再次将月份字段设置为二月,那么这一次日期字段在二月的有效范围内,并且不会出现溢出


JDatePicker项目中有很多方法来处理这个问题。同时,您可以使用其中一种方法在单个调用中设置整个日期,而不是单独设置年、月和日字段。或者在设置月份字段之前设置日期字段,以避免出现滚动情况。

您也可以使用JXDatePicker。如果需要,您可以编辑源代码,但没有可以更改布局的配置。
public static void main(String[] args) {
    JFrame testFrame = new JFrame();
    testFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    testFrame.setSize(500, 500);
    JPanel jPanel = new JPanel();

    JDatePicker picker = new JDateComponentFactory().createJDatePicker();
    picker.setTextEditable(true);
    picker.setShowYearButtons(true);
    jPanel.add((JComponent) picker);

    picker.getModel().setYear(2010);
    picker.getModel().setMonth(1);
    //picker.getModel().setMonth(1);
    picker.getModel().setDay(15);
    picker.getModel().setSelected(true);

    JPanel datePanel = new JPanel();
    datePanel.setLayout(new BorderLayout());
    datePanel.add(jPanel, BorderLayout.WEST);
    BorderLayout fb = new BorderLayout();
    testFrame.setLayout(fb);
    testFrame.getContentPane().add(datePanel, BorderLayout.WEST);
    testFrame.setVisible(true);
}