如何实现JDatePicker?

16

我正在使用最新版本1.3.4的JDatePicker。应该如何实施?

我收到编译器错误:构造函数JDatePanelImpl(UtilDateModel)未定义。建议的解决方法是:添加参数以匹配JDatePanelImpl(DateModel,Properties)。properties参数应传入什么?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import java.util.Calendar;
import java.util.Date;
import org.jdatepicker.impl.*;
import org.jdatepicker.util.*;
import org.jdatepicker.*;

    //import org.jdatepicker.graphics.*;
class date2 {

    void GUI() {
        JFrame f1 = new JFrame();
        f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f1.setSize(300, 300);
        f1.setVisible(true);

        Container conn = f1.getContentPane();
        conn.setLayout(null);

        UtilDateModel model = new UtilDateModel();
        //model.setDate(20,04,2014);
        JDatePanelImpl datePanel = new JDatePanelImpl(model);
        JDatePickerImpl datePicker = new JDatePickerImpl(datePanel);
        f1.add(datePicker);

    }

}

...跑步者...

class testDate2 {

    public void main(String[] args) {

        date2 d1 = new date2();
        d1.GUI();

    }

}

2
看这个 --> conn.setLayout(null); <-- 这是不好的,不要这样做。避免使用 null 布局,像素完美布局在现代 UI 设计中是一种幻觉。有太多因素影响组件的大小,而你无法控制其中任何一个。Swing 的设计核心是与布局管理器一起工作,放弃这些将导致无尽的问题和困难,你将花费越来越多的时间来尝试纠正它们。 - MadProgrammer
1
请参阅为什么在SWING中使用null布局不被赞同?以获取更多详细信息。 - MadProgrammer
2个回答

49
假设您正在使用1.3.4版本,则构造函数的要求已更改...
UtilDateModel model = new UtilDateModel();
//model.setDate(20,04,2014);
// Need this...
Properties p = new Properties();
p.put("text.today", "Today");
p.put("text.month", "Month");
p.put("text.year", "Year");
JDatePanelImpl datePanel = new JDatePanelImpl(model, p);
// Don't know about the formatter, but there it is...
JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new DateLabelFormatter());

使用这个AbstractFormatter...
public class DateLabelFormatter extends AbstractFormatter {

    private String datePattern = "yyyy-MM-dd";
    private SimpleDateFormat dateFormatter = new SimpleDateFormat(datePattern);

    @Override
    public Object stringToValue(String text) throws ParseException {
        return dateFormatter.parseObject(text);
    }

    @Override
    public String valueToString(Object value) throws ParseException {
        if (value != null) {
            Calendar cal = (Calendar) value;
            return dateFormatter.format(cal.getTime());
        }

        return "";
    }

}

1
最好的方法是创建一个自定义组件,继承自JPanel,覆盖其paintComponent方法并在其中绘制图像。在SO上搜索,有很多例子。 - MadProgrammer
1
还有一个JDateComponentFactory,它创建了已经设置好模型和i18n属性的JDatePickerImplJDatePanelImpl对象。我有点不清楚JDatePanelImpl构造函数是否打算由客户端直接调用,因为文档中没有很好的指导如何构建它正在使用的i18n Properties - Andrew Janke
@AndrewJanke 我曾经寻找过类似的东西,但是没有找到任何有用的东西,而且我能找到的唯一一个可行的例子是直接使用实现。我同意,这有点不太好,我也不满意。 - MadProgrammer
2
@AndrewJanke 是的,这仍然是一堆不必要的黑客行为。我看不到任何设置JDatePanel模型的方法,而不需要进行强制转换,因为这就是工厂的目的...我将使用JXDatePicker代替:P - MadProgrammer
1
@NickGraham 你知道,这16年来我从未“必须”包含serialVersionUID,但是再说一遍,我不使用Eclipse,也不是序列化的指数级别人物,因为对于大多数问题有更好的解决方案,但那只是我的看法。 - MadProgrammer
显示剩余5条评论

6

只需在JDatePanelImpl的构造函数中使用属性即可。

Properties p = new Properties();
p.put("text.today", "Today");
p.put("text.month", "Month");
p.put("text.year", "Year");
JDatePanelImpl datePanel = new JDatePanelImpl(model, p);

是的,我已经做过了。顺便说一下,这是一个非常好的软件包。我在许多应用程序中都使用它。 - Ashane Alvis
这些是来自 java.util 的属性吗? - BRHSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接