【问题标题】:How can I know if the user is inserting a valid Date or not in Java's Swing?我如何知道用户是否在 Java 的 Swing 中插入了有效的日期?
【发布时间】:2014-10-06 12:19:48
【问题描述】:

我正在创建一个项目,我应该在其中获取任何人的出生日期。因此,为此我采用了 3 个组合框:日期、月份和年份。但是我怎么知道要插入的Datevalid,因为天数不同——不同的月份和年份不同。

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

我正在使用 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();

    }
}

【问题讨论】:

  • 使用SimpleDateFormat创建Date对象,并确保首先使用simpleDateFormat.setLenient(false)
  • 我建议使用 datepicker 组件之一,例如在这个问题中建议:stackoverflow.com/questions/9368450/…
  • @Yura 那是一个更好的答案:D

标签: java swing validation date


【解决方案1】:

您可以使用SimpleDateFormat 将日期解析或格式化为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
}

【讨论】:

  • 但是如果用户在“feb”中输入“30th”日期,那么这段代码将如何处理呢?
  • 额外的 2 天将移至下个月。 sdf.parse(dateString) 将导致 2 March 2014 不等于 30 Feb 2014
  • 运行程序并打印formattedDate
  • 这里的诀窍是,您将其解析回预期的格式。如果它产生相同的字符串,则没有变化(如您在 2 月 30 日的示例)。但是,您还需要捕获异常,因为用户可能会输入"bla" 作为日期,这会导致异常。
  • @brimborium 日期是从组合框中选择的,所以没有任何字符串输入的机会
【解决方案2】:

考虑为用户提供JSpinnerSpinnerDateModel,这样用户就可以更轻松地输入或滚动并选择有效日期。

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);
    }
}

【讨论】:

    【解决方案3】:

    是否有任何现成的 GUI 组件可以从用户那里获取日期?

    是的,标准 API 和第三方库中有几个选项,如 this answer 中所示:JSpinner + SpinnerDateModelJCalendarJXDatePicker。这些组件也将解决这个问题:

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


    题外话

    关于这个:

    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);
    

    虽然使用Null layout 是完全可能的,但Swing 被设计为与布局管理器一起使用,因此不鼓励使用空布局。看这个话题Why is it frowned upon to use a null layout in SWING?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 2010-11-07
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      相关资源
      最近更新 更多