我当前的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)
个占位符。我真的不知道核心问题在于程序的不良行为在哪里,并且会欣赏任何见解。
有关问题的简化程序:
/
答案 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();
}
});
}
}