JDatePicker是一个用于选择日期的开源Java GUI组件
http://sourceforge.net/projects/jdatepicker/
当我在创建组件后立即将二月设置为月份时,似乎存在一个错误。所有其他月份都正常工作。
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);
可能是变量初始化问题。我是否正确,有人可以解决这个问题,还是我错误地使用了库?
答案 0 :(得分:1)
我注意到您的包导入是jat.jdatepicker.JDatePicker,它似乎直接包含在https://sourceforge.net/p/jat
的源代码库中您使用的此版本的JDatePicker是原始JDatePicker项目的分支。虽然开源项目不允许使用fork,但如果存在需要解决的问题,建议尝试重新提交原始项目。
我建议您在https://github.com/JDatePicker/JDatePicker
使用最新版本的项目我针对jdatepicker-1.3.4测试了你的案例,可以从中央存储库(https://search.maven.org/#artifactdetails%7Corg.jdatepicker%7Cjdatepicker%7C1.3.4%7Cjar)下载
将其与maven一起包括:
<dependency>
<groupId>org.jdatepicker</groupId>
<artifactId>jdatepicker</artifactId>
<version>1.3.4</version>
</dependency>
通过以下测试,最初选择了二月。
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);
}
答案 1 :(得分:0)
这可能取决于测试运行的时间。我注意到你在一个月底附近问了这个问题。而二月只有28天。
我怀疑发生的事情是你在本月的29日,30日或31日运行了你的代码,所以最初的选择就像2012-11-30。当您将月份值设置为01(2月)时,日值保持为30,产生“非规范化”日期,当Calendar
尝试从字段值确定实际日期时,该日期将翻到下个月。就像你在进行十进制加法时“携带”溢出一样。这将为您提供一个类似3月1日的日期。然后,如果您再次将月份字段设置为2月,则此时间字段在2月的有效范围内,并且您不会溢出。
JDatePicker项目有a pending Pull Request来处理这个问题。同时,您可以使用其中一种方法在单个调用中设置整个日期,而不是分别设置年,月和日字段。或者在设置月份字段之前设置日期字段以避免翻转条件。