【问题标题】:How do I implement JDatePicker如何实现 JDatePicker
【发布时间】:2015-01-03 20:36:08
【问题描述】:

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

我收到编译器错误:构造函数 JDatePanelImpl(UtilDateModel) 未定义。建议的修复是:添加参数以匹配 JDatePanelImpl(DateModel, 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();

    }

}

【问题讨论】:

  • 看这个 --> conn.setLayout(null); null 布局,像素完美的布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

标签: java datepicker


【解决方案1】:

假设你使用的是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 "";
    }

}

【讨论】:

  • 是的,我正在使用 Jdatepicker 1.3.4,为了测试这一点,我使用了空布局。这是我们为文凭级别准备的最后一个 Java 项目。感谢您的帮助。您还可以建议一种为 JFrame/JPanel 添加背景图像的方法吗?
  • 最好的方法是创建一个从 JPanel 扩展的自定义组件,覆盖它的 paintComponent 方法并在那里绘制图像。搜SO,例子很多
  • 还有一个 JDateComponentFactory,它创建了 JDatePickerImplJDatePanelImpl 对象,模型和 i18n 属性已经设置。我有点不清楚 JDatePanelImpl 构造函数是否打算由客户端直接调用,因为文档中没有关于如何构造它正在使用的 i18n Properties 的很好的指导。
  • @AndrewJanke 是的,这仍然是一堆不需要的黑客行为。无论如何我都看不到为JDatePanel设置模型而不铸造它,你不应该铸造它,因为这是工厂的重点......我将使用JXDatePicker代替:P
  • @NickGraham 你知道,16 年来我从来没有“不得不”包含serialVersionUID,但话又说回来,我不使用 Eclipse,也不是序列化的指数,因为那里是大多数问题的更好解决方案,但这只是我
【解决方案2】:

只需在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);

【讨论】:

  • 是的,已经这样做了。顺便说一句,它实际上是相当不错的包装。我将它用于我的许多应用程序。
  • 这些是java.util的属性吗?
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多