如何知道用户是否在Java'中插入有效日期;什么是秋千?

如何知道用户是否在Java'中插入有效日期;什么是秋千?,java,swing,validation,date,Java,Swing,Validation,Date,我正在创建一个项目,其中我应该记录任何人的出生日期。因此,我选择了3个组合框:日期、月份和年份。但是我如何知道将要插入的日期是有效的,因为天数不同,月份不同,年份不同 有没有现成的GUI组件可以从用户那里获取日期 我正在使用Swing软件包进行设计 我的示例代码是 import java.awt.*; import javax.swing.*; public class Pro1 extends JFrame { JComboBox dd, mm, yy; JLabel

我正在创建一个项目,其中我应该记录任何人的出生日期。因此,我选择了3个组合框:日期、月份和年份。但是我如何知道将要插入的日期是有效的,因为天数不同,月份不同,年份不同

有没有现成的
GUI组件
可以从用户那里获取日期

我正在使用Swing软件包进行设计

我的示例代码是

import java.awt.*;
import javax.swing.*;

public class Pro1 extends JFrame
{

    JComboBox  dd, mm, yy;

    JLabel doblbl;

    Container con;

    public Pro1()
    {
        con = getContentPane(); 

        doblbl = new JLabel("Date of Birth :-");
        doblbl.setHorizontalAlignment(SwingConstants.CENTER);   

        doblbl.setFont(new Font("Arial",Font.BOLD,17));
        doblbl.setForeground(Color.blue);

        doblbl.setOpaque(true); 
        doblbl.setBackground(new Color(230,180,230));


        dd = new JComboBox();
        mm = new JComboBox();
        yy = new JComboBox();

        for(int i = 1; i<=31; i++)
            dd.addItem("" + i);

        for(int i = 1; i<=12; i++)
            mm.addItem("" + i);

        for(int i = 1960; i<=2014; i++)
            yy.addItem("" + i);


        con.setLayout(null); 

        setDefaultCloseOperation(EXIT_ON_CLOSE);    

        int i = 120;

        doblbl.setBounds(30,i+=40,270,30);

        int j = 120;

        dd.setBounds(350,j+=40,50,30);
        mm.setBounds(420,j,50,30);
        yy.setBounds(480,j,70,30);

        con.add(doblbl);

        con.add(dd);
        con.add(mm);
        con.add(yy);

        setSize(1500,800);
        setVisible(true);

        con.setBackground(new Color(125,80,140));           
    }

    public static void main(String s[])
    {
        Pro1 p1 = new Pro1();

    }
}
import java.awt.*;
导入javax.swing.*;
公共类Pro1扩展了JFrame
{
日本邮政信箱,年月日;
JLabel-doblbl;
集装箱集装箱;
公共项目1()
{
con=getContentPane();
doblbl=新的JLabel(“出生日期:-”);
doblbl.设置水平对齐(旋转恒量中心);
doblbl.setFont(新字体(“Arial”,字体粗体,17));
设置前景(颜色为蓝色);
doblbl.setOpaque(真);
doblbl.setBackground(新颜色(230180230));
dd=新的JComboBox();
mm=新的JComboBox();
yy=新的JComboBox();
对于(int i=1;i,您可以使用将日期解析或格式化为
dd/MM/yyyy

示例代码:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String dateString = "30/02/2014"; // form date string in above format

String formattedDate = sdf.format(sdf.parse(dateString));
if (formattedDate.equals(dateString)) {
    System.out.println("valid date");
} else {
    System.out.println("Invalid date"); // It's an invalid date
}
您可以使用将日期解析或格式化为
dd/MM/yyyy

示例代码:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
String dateString = "30/02/2014"; // form date string in above format

String formattedDate = sdf.format(sdf.parse(dateString));
if (formattedDate.equals(dateString)) {
    System.out.println("valid date");
} else {
    System.out.println("Invalid date"); // It's an invalid date
}
有没有现成的GUI组件可以从用户那里获取日期

是的,标准API和第三方库中有几个选项,如中所示:
JSpinner
+
SpinnerDateModel
JCalendar
JXDatePicker
。这些组件还将解决其他问题:

但是我怎么知道要插入的日期是 有效,因为不同月份的日期数和 年份不同


离题 关于这一点:

con.setLayout(null);
...
dd.setBounds(350,j+=40,50,30);
mm.setBounds(420,j,50,30);
yy.setBounds(480,j,70,30);
...
con.add(dd);
con.add(mm);
con.add(yy);
虽然完全可以使用,但Swing设计为与布局管理器一起使用,因此不鼓励使用空布局。请参阅本主题

有没有现成的GUI组件可以从用户那里获取日期

是的,标准API和第三方库中有几个选项,如中所示:
JSpinner
+
SpinnerDateModel
JCalendar
JXDatePicker
。这些组件还将解决其他问题:

但是我怎么知道要插入的日期是 有效,因为不同月份的日期数和 年份不同


离题 关于这一点:

con.setLayout(null);
...
dd.setBounds(350,j+=40,50,30);
mm.setBounds(420,j,50,30);
yy.setBounds(480,j,70,30);
...
con.add(dd);
con.add(mm);
con.add(yy);

虽然使用是完全可能的,但Swing设计为与布局管理器一起使用,因此不鼓励使用空布局。请参阅本主题。

考虑为用户提供带有
SpinnerDateModel的
JSpinner
,这样用户就更容易输入或滚动并选择有效日期

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class PromptForDate {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {}
                SpinnerDateModel dateModel = new SpinnerDateModel(
                        new Date(), null, null, Calendar.DAY_OF_MONTH );
                JSpinner dateSpinner = new JSpinner(dateModel);
                dateSpinner.setEditor(
                        new JSpinner.DateEditor(dateSpinner, "dd/MM/yyyy"));

                JOptionPane.showMessageDialog(
                        null, dateSpinner, "D.O.B.?", 
                        JOptionPane.QUESTION_MESSAGE);

                System.out.println(dateModel.getValue());
            }
        };
        SwingUtilities.invokeLater(r);
    }
}


考虑为用户提供带有
SpinnerDateModel
JSpinner
,这样用户就更容易输入或滚动并选择有效日期

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class PromptForDate {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                            UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {}
                SpinnerDateModel dateModel = new SpinnerDateModel(
                        new Date(), null, null, Calendar.DAY_OF_MONTH );
                JSpinner dateSpinner = new JSpinner(dateModel);
                dateSpinner.setEditor(
                        new JSpinner.DateEditor(dateSpinner, "dd/MM/yyyy"));

                JOptionPane.showMessageDialog(
                        null, dateSpinner, "D.O.B.?", 
                        JOptionPane.QUESTION_MESSAGE);

                System.out.println(dateModel.getValue());
            }
        };
        SwingUtilities.invokeLater(r);
    }
}


使用
SimpleDateFormat
创建
Date
对象,并确保使用
SimpleDateFormat.setLenent(false)
首先。我建议使用一个日期选择器组件,例如在这个问题中建议的:@Yura好,这是一个更好的答案:DUse
SimpleDateFormat
创建一个
Date
对象,并确保使用
SimpleDateFormat.setLenient(false)
首先。我建议使用一个日期选择器组件,例如,在这个问题中建议:@Yura这是一个更好的答案:Dbut如果用户在“二月”中输入“30”日期,那么这个代码将如何处理?额外的2天将移到下个月。
sdf.parse(dateString)
将导致2014年3月2日
,这并不等于2014年2月30日
只需运行程序并打印
formattedDate
值这里的诀窍是,将其解析回预期的格式。如果结果是相同的字符串,则不会发生变化(如您2月30日的示例)。但是,您还需要捕获异常,因为用户可能会输入
“bla”
作为日期,这将导致异常。@brimborium日期是从组合框中选择的,因此不可能输入任何字符串。但是如果用户将在“二月”中输入“30”日期那么这段代码将如何处理呢?额外的2天将被转移到下个月。
sdf.parse(dateString)
将导致2014年3月2日,这并不等于2014年2月30日只需运行程序并打印
formattedDate
值这里的诀窍是,将其解析回预期的格式。如果结果是相同的字符串,则不会发生变化(如您2月30日的示例)。但是,您还需要捕获异常,因为用户可能会输入
“bla”
作为日期,这将导致异常。@brimborium从组合框中选择日期,因此不可能输入任何字符串