使用JDatePicker的NullPointerException

时间:2016-09-23 20:46:52

标签: java nullpointerexception

我正在尝试用日期选择器字段替换JTextField,我按照我能够找到的安装说明以及SO上的其他示例。另外,我有最新版本(v1.3.4) - https://sourceforge.net/projects/jdatepicker/

//...
import org.jdatepicker.impl.JDatePanelImpl;
import org.jdatepicker.impl.JDatePickerImpl;
import org.jdatepicker.impl.UtilDateModel;

public class NewTransactionDialog extends JDialog {

    private JPanel panel = new JPanel(new GridLayout(0, 1));

    //...

    public NewTransactionDialog() {

        //...

        // date 
        panel.add(new JLabel("Date:"));
//        panel.add(new JTextField()); // old text field i want to replace
        UtilDateModel model = new UtilDateModel();
        JDatePanelImpl datePanel = new JDatePanelImpl(model, null);
        JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, null);
        panel.add(datePicker);

        //...

        getContentPane().add(panel);
        pack();
    }
}

道歉,如果这只是一些愚蠢的错误,但我不能从我这边看到我这次做错了什么。我确实必须添加第二个NULL参数,因为Eclipse告诉我构造函数不匹配。这似乎与我说的只有一个参数传递给构造函数(JDatePanelImpl,JDatePickerImpl)的每个例子都不同 - 它们应该作为非NULL的东西传递吗?

eclipse控制台中抛出的错误是:7

Exception in thread "main" java.lang.NullPointerException
    at org.jdatepicker.impl.JDatePanelImpl$InternalView.getPreviousMonthButton(JDatePanelImpl.java:517)
    at org.jdatepicker.impl.JDatePanelImpl$InternalView.getPreviousButtonPanel(JDatePanelImpl.java:442)
    at org.jdatepicker.impl.JDatePanelImpl$InternalView.getNorthPanel(JDatePanelImpl.java:251)
    at org.jdatepicker.impl.JDatePanelImpl$InternalView.initialise(JDatePanelImpl.java:234)
    at org.jdatepicker.impl.JDatePanelImpl$InternalView.<init>(JDatePanelImpl.java:222)
    at org.jdatepicker.impl.JDatePanelImpl.<init>(JDatePanelImpl.java:110)
    at biz.martyn.budget.NewTransactionDialog.<init>(NewTransactionDialog.java:54)
    at biz.martyn.budget.TransactionsToolbar.<init>(TransactionsToolbar.java:34)
    at biz.martyn.budget.Budget.main(Budget.java:39)

2 个答案:

答案 0 :(得分:1)

您需要将构造函数中的第二个参数作为Properties的实例传递。可能很简单:

JDatePanelImpl datePanel = new JDatePanelImpl(model, new Properties());
JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, new Properties());

这将摆脱NullPointerException,但您可能会看到空字符串。阅读库的文档。我查看了源代码,Properties实例似乎应该定义了这些属性:text.todaytext.monthtext.year

答案 1 :(得分:1)

at org.jdatepicker.impl.JDatePanelImpl$InternalView.getPreviousMonthButton(JDatePanelImpl.java:517)

他失败的地方。在this.i18nStrings.getProperty("text.month")

上有一个方法调用

但您正在使用JDatePanelImpl为该字段初始化null

  panel.add(new JLabel("Date:"));
  UtilDateModel model = new UtilDateModel();
  JDatePanelImpl datePanel = new JDatePanelImpl(model, null); // <<<<
  JDatePickerImpl datePicker = new JDatePickerImpl(datePanel, null); 
  panel.add(datePicker, BorderLayout.CENTER);

这就是典型的NullPointerException原因

CTOR签名上写着:public JDatePanelImpl(DateModel<?> model, Properties i18nStrings) 所以等待Properties对象。