Java:我的JFormattedTextField中不需要的行为源在哪里?

时间:2014-04-07 13:47:12

标签: java swing simpledateformat jformattedtextfield

我当前的Java项目要求我处理日期,通过我的研究和修补我发现setLenient()方法默认为true。当我将其设置为false时,我的代码开始出现问题。

我有JFormattedTextField初始化SimpleDateFormat。对于我的项目,我需要始终显示/个占位符,因此使用this问题的答案,我能够以{{1}的形式安装/作为占位符}

MM/dd/yyyy设置为SimpleDateFormat并输入不完整的日期(例如12/34/5),然后将焦点从格式化的文本字段移开时,整个字段包括setLenient(false) s已删除。

/设置为SimpleDateFormat时,不会发生这种情况。相反,一旦焦点丢失,12/34/5的不完整条目将设置为setLenient(true)

我需要能够在我的简单日期格式化程序中使用01/03/0006,同时始终拥有setLenient(false)个占位符。我真的不知道核心问题在于程序的不良行为在哪里,并且会欣赏任何见解。

有关问题的简化程序:

/

1 个答案:

答案 0 :(得分:3)

您可以使用将验证内容的InputVerifier。如果日期无效,您可以弹出JOptionPane。

请参阅下面的示例。我尝试解析方法isValidDate中的输入。如果它不是有效日期,则返回false,导致InputVerifier在其verify方法中返回false。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.Box;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.MaskFormatter;

public class InputVerifyDate {

    private SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");

    public InputVerifyDate() {
        JFormattedTextField formattedField = createFormattedTextField();
        JTextField field = new JTextField(10);
        format.setLenient(false);

        Box box = Box.createVerticalBox();
        box.add(formattedField);
        box.add(Box.createVerticalStrut(10));
        box.add(field);
        box.setBorder(new EmptyBorder(10, 10, 10, 10));

        JFrame frame = new JFrame();
        frame.add(box);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private JFormattedTextField createFormattedTextField() {
        JFormattedTextField formattedField = null;
        try {
            MaskFormatter dateMask = new MaskFormatter("##/##/####");
            formattedField = new JFormattedTextField(dateMask);
        } catch (ParseException ex) {
            Logger.getLogger(InputVerifyDate.class.getName()).log(Level.SEVERE, null, ex);
        }
        formattedField.setColumns(10);
        formattedField.setInputVerifier(getInputVerifier());
        return formattedField;
    }

    private InputVerifier getInputVerifier() {
        InputVerifier verifier = new InputVerifier() {

            @Override
            public boolean verify(JComponent input) {
                JFormattedTextField field = (JFormattedTextField) input;
                String text = field.getText();
                return isValidDate(text);
            }

            @Override
            public boolean shouldYieldFocus(JComponent input) {
                boolean valid = verify(input);
                if (!valid) {
                    JOptionPane.showMessageDialog(null, "Please enter a valid date in format dd/mm/yyyy");
                }
                return valid;
            }

        };
        return verifier;
    }

    public boolean isValidDate(String dateString) {
        try {
            format.parse(dateString);
            return true;
        } catch (ParseException ex) {
            return false;

        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new InputVerifyDate();
            }
        });

    }
}