Java 如何使jtextfield具有固定的日期格式?

Java 如何使jtextfield具有固定的日期格式?,java,swing,date,jtextfield,Java,Swing,Date,Jtextfield,使用JTextField创建固定日期格式时遇到问题。有没有办法让JTextField具有固定的日期格式?您应该看看 (带and) (in) 对于初学者…您可以将JFormattedTextField与 我认为最好使用jFormattedTextField 我有以下代码,请尝试以下代码: package your_package; import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFo

使用
JTextField
创建固定日期格式时遇到问题。有没有办法让JTextField具有固定的日期格式?

您应该看看

  • (带and)
  • (in)

对于初学者…

您可以将JFormattedTextField与


我认为最好使用jFormattedTextField

我有以下代码,请尝试以下代码:

package your_package;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class.....{

private String getdate(){
      DateFormat format = new SimpleDateFormat("MM/DD/YYYY"); //display your format.
      Date date = new Date();//puts the date in variable.
      return dateformat.format(date); //returns the format to the date variable.
}

public your_app{
     .....
     String date = new getdate();
     txtDate.setvalue(date);
}
}

希望这能给你一个想法并帮助你……:)

如果使用Swing,请在JFrame中添加JFormattedTextField。在属性中,单击formatterFactory。在对话框中,选择日期类别,然后选择格式。现在将强制执行您的格式


我在Netbeans中的解决方案是:从JDateChooser组件中选择日期,然后一个不可聚焦的jtextfield从JDateChooser中选择的日期获取日期: (1) 为了制作固定日期格式,我们在JDateChooser的属性中设置了日期格式:yyyy-MM-dd; (2) 使“jtextfield.setFocusable(false)”,这是为了避免输入错误的日期格式或不需要的字符


正如评论中所说,您可能更喜欢查看日期选择器组件,而不是文本字段。日期选择器组件将使用户从日期语法中解脱出来

java.time 我建议您使用java.time(现代java日期和时间API)进行日期工作。因此,对于喜欢使用文本字段作为日期的人,我做了一个小实验,将
JFormattedTextField
与java.time中的
LocalDate
类结合使用。对于文本字段,我发现最好编写一个小的子类,指定从日期字段获得的对象类型是
LocalDate

public class DateField extends JFormattedTextField {

    private static final long serialVersionUID = -4070878851012651987L;

    public DateField(DateTimeFormatter dateFormatter) {
        super(dateFormatter.toFormat(LocalDate::from));
        setPreferredSize(new Dimension(100, 26));
    }

    @Override
    public LocalDate getValue() {
        return (LocalDate) super.getValue();
    }

}
JFormattedTextField
接受用于格式化和解析值的
java.text.Format
对象<来自java.time的code>DateTimeFormatter有几个重载的
toFormat
方法,它们为我们提供了
java.text.Format
。甚至可以指定从
格式
获取的对象类型

要尝试此日期字段类,请执行以下操作:

public class TestFrame extends JFrame {

    public TestFrame() {
        super("Test");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
                .withLocale(Locale.forLanguageTag("es"));
        DateField dateField = new DateField(dateFormatter);
        add(dateField);
        dateField.setValue(LocalDate.now(ZoneId.systemDefault()));

        JButton okButton = new JButton("OK");
        okButton.addActionListener(ev -> JOptionPane.showMessageDialog(TestFrame.this,
                "Date entered is " + dateField.getValue()));
        add(okButton );

        pack();
    }

    public static void main(String[] args) {
        new TestFrame().setVisible(true);
    }

}
我指定西班牙语格式只是为了清楚地证明正在进行格式化和解析。在这里,您可以指定用户喜欢的格式。例如,CalizedDate(FormatStyle.SHORT)的
DateTimeFormatter.
或模式(“dd/MM/uu”)的
DateTimeFormatter.
。考虑到短格式,因为大多数用户不喜欢键入超过必要的。

现在出现的
JFrame
如下所示:

而不是我11年前输入的今天的日期。2020并单击确定:

链接
解释如何使用java.time。

看看。或者使用更现代的UI组件,如well。。。您的答案存在一些问题:代码片段a)与您的描述不相关b)它不会编译(即使将点视为完整的代码:-)c)不符合java命名约定d)逻辑颠倒(假设txtData是formattedTextField)e)与其他答案相比没有什么新的。。。
public class TestFrame extends JFrame {

    public TestFrame() {
        super("Test");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
                .withLocale(Locale.forLanguageTag("es"));
        DateField dateField = new DateField(dateFormatter);
        add(dateField);
        dateField.setValue(LocalDate.now(ZoneId.systemDefault()));

        JButton okButton = new JButton("OK");
        okButton.addActionListener(ev -> JOptionPane.showMessageDialog(TestFrame.this,
                "Date entered is " + dateField.getValue()));
        add(okButton );

        pack();
    }

    public static void main(String[] args) {
        new TestFrame().setVisible(true);
    }

}