我想在JDateChooser
中按下ENTER键时进行一些输入验证。我知道在JTextField
元素中可以添加ActionListener
,其中ENTER键会触发一个动作。但是,当我添加ActionListener
并在日期选择器中按ENTER键时,并不总是接收到该操作。
在下面的示例中,在程序首次启动时按ENTER键会触发JDateChooser
中的操作,焦点将按预期移动到下一个组件。但是,在后续遍历中,我必须在触发操作之前输入一个字符。正如预期的那样,在两个JTextField
元素中触发了一个动作。
有人可以解释为什么在ActionListener
的编辑器中添加JDateChooser
时,ENTER键的行为并不总是相同吗?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import com.toedter.calendar.JDateChooser;
public class DateExample extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField textField;
private JTextField textField_1;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DateExample frame = new DateExample();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public DateExample() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new GridLayout(0, 1, 0, 0));
JDateChooser dateChooser = new JDateChooser("yyyy/MM/dd", "####/##/##", '_');
((JTextField) dateChooser.getDateEditor().getUiComponent()).addActionListener(this);
contentPane.add(dateChooser);
textField = new JTextField();
textField.setColumns(10);
textField.addActionListener(this);
contentPane.add(textField);
textField_1 = new JTextField();
textField_1.setColumns(10);
textField_1.addActionListener(this);
contentPane.add(textField_1);
pack();
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Action received.");
KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
}
}
答案 0 :(得分:0)
用于验证您可以将caretListener添加到编辑器,或者您可以扩展JDateChooser并覆盖propertyChange方法。
根据个人经验,我最终创建了自己的TextFieldDateEditor
public class MyDateEditor implements com.toedter.calendar.IDateEditor
并用
调用它public JDateChooser(Date date, String dateFormatString, IDateEditor dateEditor)
您可以根据需要与文本字段进行交互。
答案 1 :(得分:0)
有人可以解释为什么在
ActionListener
的编辑器中添加JDateChooser
时,ENTER键的行为并不总是相同吗?
附加到IDateEditor组件的JDateChooser接口的默认实现的UI组件不是普通的JTextField,而是JFormattedTextField。当格式化的文本字段具有焦点并按ENTER键时,插入文本字段的文本将发送到基础格式化程序,以便验证它并更新模型。通过附加ActionListener
或设置Action
到Key Binding机制,我们可能会干扰此默认行为,结果无法预测。
我强烈建议你不要这样做,让格式化的文本字段做它应该做的事情。
注意:IDateEditor
接口的默认实现称为JTextFieldDateEditor,其代码为available here
我想在
JDateChooser
中按下ENTER键时进行一些输入验证。
在这种情况下,我建议您遵循“预防性”方法,尽可能地限制用户输入以避免它们引入不正确的值,而不是在发生后验证输入。我们可以为此目的使用一些有用的工具:
通过JDateChooser
API设置最小/最大可选日期。
附加实现IDateEvaluator接口的日期评估程序。这对于使一个或多个日期无效以防止用户可以选择它们非常有用。请参阅示例here或here。
实施我们自己的IDateEditor
。我们可以将默认实现作为基础并使用格式化程序。注意:我会避免扩展JFormattedTextField
并使用合成。早期尝试实施shwon in this question(虽然需要完善)。