验证可能无法获得焦点的JTextField

时间:2017-05-03 13:54:09

标签: java swing

我一直在查看input verification上的java跟踪,我希望有人可以确认InputVerifier类是解决问题的最佳方法。

我在JTextField中有多个JPanel,并带有提交按钮。每个字段最初都是空白的。问题是Verifier类在失去焦点的情况下工作,但是对于多个字段,没有什么能确保每个字段首先获得焦点。例如,您可以在第一个字段中输入有效的条目,然后单击“提交”,尽管以下字段需要验证。

我确定我可以将某些内容组合在一起,当按下提交按钮时,它会检查相关的JTextArea是否有任何输入,并将焦点分配给仍然需要数据的第一个,但是我希望有更优雅的方式来检查输入?特别是因为InputVerifier可以为组件而不仅仅是文本字段设置。跟踪或自定义焦点并不是真的有帮助,因为几个字段是可选的但仍然是逻辑顺序(所以我不想强迫以不自然的顺序聚焦以确保数据输入)

我考虑过将InputVerifier添加到包含组件或提交按钮,但同样,我无法解决焦点问题。

1 个答案:

答案 0 :(得分:3)

  

问题是Verifier类在失去焦点的情况下工作,但是对于多个字段,没有什么能确保每个字段都获得焦点。例如,您可以在第一个字段中输入有效的条目,然后单击“提交”,尽管以下字段需要验证。

这是正确的。 InputVerifier仅在组件失去焦点时才起作用。

通常,论坛上有两种类型的编辑:

  1. 字段级别修改。这些是编辑以确保组件包含有效数据。这就是数字是数字,邮政编码是否经过适当的格式验证等。这些类型的编辑可以使用InputVerifier完成

  2. 表单级别编辑。这些确保输入表单的所有必填字段。当您单击"提交"按钮。

  3. 如果所有字段都是强制性的,您可以尝试禁用"提交"按钮,直到使用以下逻辑输入所有文本字段中的数据:

    import java.awt.*;
    import java.awt.event.*;
    import java.util.List;
    import java.util.ArrayList;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class DataEntered implements DocumentListener
    {
        private JButton button;
        private List<JTextField> textFields = new ArrayList<JTextField>();
    
        public DataEntered(JButton button)
        {
            this.button = button;
        }
    
        public void addTextField(JTextField textField)
        {
            textFields.add( textField );
            textField.getDocument().addDocumentListener( this );
        }
    
        public boolean isDataEntered()
        {
            for (JTextField textField : textFields)
            {
                if (textField.getText().trim().length() == 0)
                    return false;
            }
    
            return true;
        }
    
        @Override
        public void insertUpdate(DocumentEvent e)
        {
            checkData();
        }
    
        @Override
        public void removeUpdate(DocumentEvent e)
        {
            checkData();
        }
    
        @Override
        public void changedUpdate(DocumentEvent e) {}
    
        private void checkData()
        {
            button.setEnabled( isDataEntered() );
        }
    
        private static void createAndShowUI()
        {
            JButton submit = new JButton( "Submit" );
            submit.setEnabled( false );
    
            JTextField textField1 = new JTextField(10);
            JTextField textField2 = new JTextField(10);
    
            DataEntered de = new DataEntered( submit );
            de.addTextField( textField1 );
            de.addTextField( textField2 );
    
            JFrame frame = new JFrame("SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(textField1, BorderLayout.WEST);
            frame.add(textField2, BorderLayout.EAST);
            frame.add(submit, BorderLayout.SOUTH);
            frame.pack();
            frame.setLocationByPlatform( true );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    

    请记住使用这些方法,如果数据丢失,您就不会收到任何消息。

      

    我确定我可以将某些东西放在一起,当按下提交按钮时,它会检查相关的JTextAreas是否有任何输入,并将焦点分配给仍然需要数据的第一个,但我希望那里检查输入是一种更优雅的方式吗?

    这是一种非常合理的方法,因为它可以为用户提供问题所在的视觉反馈。