问题是Verifier类在失去焦点的情况下工作,但是有多个字段没有确保每个焦点都在第一个位置。例如,您可以在第一个字段中输入一个有效条目,然后单击“提交”,尽管以下字段需要验证。
这是正确的。 InputVerifier仅在组件失去焦点时才起作用。
通常情况下,有两种类型的编辑在论坛上做了:
现场级的编辑。这些编辑是为了确保组件包含有效数据。这是数字是数字,邮政编码验证正确的格式等。这些类型的编辑可以通过使用输入验证器完成表单级别编辑使用输入验证器
。这些确保输入表单的所有必填字段。这是在您点击“提交”按钮时完成的。
如果所有字段是强制性的,你可以尝试禁用使用逻辑的东西“提交”按钮,直到数据中的所有文本字段中输入,如:
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在所有和分配重点向第一个,仍然需要数据,但我希望提交有一个更优雅的方式来检查输入?
这是一个完全合理的方法,因为它给用户视觉反馈问题的地方。
我认为InputVerifier在处理焦点时具有灵活性。你重写你的验证器的'shouldYieldFocus'方法吗? –
我简要地阅读了关于'shouldYieldFocus',以及关于自定义和跟踪焦点,但不,我还没有。我现在仔细检查它。但不是问题(在我非常有限的观点中)不是如何产生,而是如何确保所有组件在表单提交之前获得焦点 - 不强制任意输入顺序(例如'name','address'和'邮编'将是必需的,但我不希望邮政编码在可选字段'城市'之前被回答) – NickW
如果这是我的代码,我会考虑将同一个DocumentListener添加到所有JTextField文档。当发生任何更改时,请检查所有JTextField文本,验证数据,如果有效,则启用提交JButton的Action。 –