JFormatted Field在不应该关注时产生焦点

时间:2014-04-11 16:00:01

标签: java swing jformattedtextfield inputverifier

前几天我问了一个问题here,并收到了合适的答案。但是,当我尝试将示例代码转换为我自己的程序并开始将其转换为我的需求时,它的工作方式就不应该如此。

我已经多次查看了这两组代码,我看到的唯一真正的区别是我的代码使用的是面板而不是框,但是,我没有看到任何文档描述性能与{{{{ 1}}。我的程序不应该允许宽松的一天,但确实如此,并允许InputVerifier在不应该的时候产生焦点。我的问题在哪里?

我目前的代码:

JFormattedField

上一个问题回答的代码:

public class Hello implements ActionListener{
    private JFrame frame = new JFrame();
    private JPanel panel = new JPanel();
    private Date endingDate = new Date();
    private String endingString = null;
    private SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
    private JFormattedTextField formattedField = null;
    private JLabel label1 = new JLabel();
    private JLabel label2 = new JLabel();
    private TextArea ta = new TextArea();
    private Button b = new Button("click");

    public Hello() {
        b.addActionListener(this);
        label1 = new JLabel("test");
        label2 = new JLabel("test");

        formattedField = createFormattedTextField();
        format.setLenient(false);

        panel.add(formattedField);
        panel.add(label1);
        panel.add(label2);
        panel.add(ta);
        panel.add(b);
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);


    }

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

        System.out.println("Hello, World");
    }

    private JFormattedTextField createFormattedTextField() {
        JFormattedTextField formattedField = null;
        try {
            MaskFormatter dateMask = new MaskFormatter("##/##/####");
            formattedField = new JFormattedTextField(dateMask);
        } catch (ParseException ex) {
            Logger.getLogger(Hello.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 void actionPerformed(ActionEvent e) {
        System.out.println("Action performed");
        System.out.println(formattedField);
        endingDate = (Date) formattedField.getValue();

        System.out.println(endingDate);
        endingString = format.format(endingDate);
        System.out.println(endingString);

    }
}

1 个答案:

答案 0 :(得分:1)

将代码从一个程序慢慢复制到另一个程序后,我发现了问题。你正在使用完全摆动的组件,除了TextArea,它是awt。如果将其更改为swing JTextArea,则事件将按预期触发。 :)

我想这是由awt层引起的(我明白这是摇摆的一个原始基础)不了解摇摆'更高级的活动。