我想在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();
    }

}

最佳答案

为了进行验证,您可以将caretListener添加到编辑器中,或者可以扩展JDateChooser并覆盖propertyChange方法。

根据个人经验,我最终创建了自己的TextFieldDateEditor

public class MyDateEditor implements com.toedter.calendar.IDateEditor


并用

public JDateChooser(Date date, String dateFormatString, IDateEditor dateEditor)


这样,您可以根据需要与文本字段进行交互。

关于java - 使用Enter键遍历JDateChooser,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24323126/

10-11 04:08