2017-05-03 40 views
0

我一直在寻找input verification上的java线索,我希望有人可以确认InputVerifier类是解决我的问题的最佳方式。验证可能无法获得焦点的JTextFields

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

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

我想过将InputVerifier添加到包含组件或提交按钮,但我再次无法解决焦点问题。

+1

我认为InputVerifier在处理焦点时具有灵活性。你重写你的验证器的'shouldYieldFocus'方法吗? –

+0

我简要地阅读了关于'shouldYieldFocus',以及关于自定义和跟踪焦点,但不,我还没有。我现在仔细检查它。但不是问题(在我非常有限的观点中)不是如何产生,而是如何确保所有组件在表单提交之前获得焦点 - 不强制任意输入顺序(例如'name','address'和'邮编'将是必需的,但我不希望邮政编码在可选字段'城市'之前被回答) – NickW

+1

如果这是我的代码,我会考虑将同一个DocumentListener添加到所有JTextField文档。当发生任何更改时,请检查所有JTextField文本,验证数据,如果有效,则启用提交JButton的Action。 –

回答

3

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

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

通常情况下,有两种类型的编辑在论坛上做了:

  1. 现场级的编辑。这些编辑是为了确保组件包含有效数据。这是数字是数字,邮政编码验证正确的格式等。这些类型的编辑可以通过使用输入验证器完成表单级别编辑使用输入验证器

  2. 。这些确保输入表单的所有必填字段。这是在您点击“提交”按钮时完成的。

如果所有字段是强制性的,你可以尝试禁用使用逻辑的东西“提交”按钮,直到数据中的所有文本字段中输入,如:

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在所有和分配重点向第一个,仍然需要数据,但我希望提交有一个更优雅的方式来检查输入?

这是一个完全合理的方法,因为它给用户视觉反馈问题的地方。

+0

*编辑:阅读你的新增内容。谢谢 – NickW

+0

有趣的看到DocumentListener的例子。谢谢。我真的需要详细了解课堂。你提到你不能通过这种方法通知最终用户,但是我不能将每个InputVerifiers附加到传递给你的类的每个TextField上,然后(以某种方式)使用Verifier在循环“isDataEntered”时触发某种通知()'。我确信我没有经过仔细考虑,但只是在想:D – NickW

+0

只是为了澄清我的可能构思不清的想法:作为你的'isDataEntered()'循环,它不仅可以检查数据输入(如图所示),但调用以前已添加到单个文本字段的InputVerifier自定义子类的'verify()'方法?这可以让我标记哪些领域需要关注? – NickW