我有以下几行代码:
SpinnerDateModel spinMod=new SpinnerDateModel();
JSpinner spin=new JSpinner(spinMod);
//spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
当我显示微调器时,我可以编辑它并在月份字段中写入我想要的任何两位数字。
如果我点击JSpinner
方面,我只能增加或减少月份或日期数字,以使其值合法。但是,如果我添加最后一个outcommented行,这也不会起作用。
问题是如何使用自定义格式JSpinner
仅接受合法日期。
另外,如果我将ActionListener
添加到获取日期的按钮,我会得到一个"正确的日期"如果我将日期编辑器的格式应用于从JSpinner
获得的值,则将getValue()直接应用于JSpinner
,但输入错误(输入的那个)。我希望动作侦听器以我的自定义格式获取正确的值,并且我希望JSpinner
仅接受自定义格式的输入。这可能吗?
我的测试代码如下:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.text.*; //for the date format
public class TestDates{
JLabel jl=new JLabel("Date:");
JFrame jf=new JFrame("Test SpinnerDateFormat");
JButton jb=new JButton("Get Date");
SpinnerDateModel spinMod=new SpinnerDateModel();
JSpinner spin=new JSpinner(spinMod);
class jbHandler implements ActionListener{
public void actionPerformed(ActionEvent evt){
JSpinner.DateEditor de=(JSpinner.DateEditor)spin.getEditor();
String wrongDate=de.getFormat().format(spin.getValue());
Date okDate=(Date)spin.getValue();
System.out.println(">>>\n"+wrongDate+"\n"+okDate);
}
}
JPanel pane=new JPanel();
public TestDates(){
jf.setLocationRelativeTo(null);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pane.add(jl);
jb.addActionListener(new jbHandler());
pane.add(jb);
spin.setValue(new Date());//this doesn't work properly with the custom format
spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
pane.add(spin);
jf.add(pane);
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
TestDates tdate=new TestDates();
}
});
}
}
答案 0 :(得分:4)
如果我点击JSpinner方面,我只能增加和减少月份或日期数字,以便它们的值合法。但是,如果我加上 最后一个outcommented行,这也行不通。
问题在于此行中的日期模式中有一点(但很常见)错误:
spin.setEditor(new JSpinner.DateEditor(spin,"dd.mm.yyyy"));
在此模式中,“mm”表示分钟而非月份,从而导致不同的输出。正确的模式是:
spin.setEditor(new JSpinner.DateEditor(spin,"dd.MM.yyyy"));
问题是如何使JSpinner只接受使用自定义格式的合法日期。
如果您想阻止用户键入无效日期,则需要使用编辑器的格式化程序并禁止无效输入。请参阅以下代码段:
SpinnerDateModel model = new SpinnerDateModel();
JSpinner spinner = new JSpinner(model);
JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "dd.MM.yyyy");
DateFormatter formatter = (DateFormatter)editor.getTextField().getFormatter();
formatter.setAllowsInvalid(false); // this makes what you want
formatter.setOverwriteMode(true);
请参阅Customizing Formats trail。
另请参阅SimpleDateFormat javadoc中 日期和时间模式 部分提取的下表: