我一直在查看input verification上的java跟踪,我希望有人可以确认InputVerifier
类是解决问题的最佳方法。
我在JTextField
中有多个JPanel
,并带有提交按钮。每个字段最初都是空白的。问题是Verifier类在失去焦点的情况下工作,但是对于多个字段,没有什么能确保每个字段首先获得焦点。例如,您可以在第一个字段中输入有效的条目,然后单击“提交”,尽管以下字段需要验证。
我确定我可以将某些内容组合在一起,当按下提交按钮时,它会检查相关的JTextArea
是否有任何输入,并将焦点分配给仍然需要数据的第一个,但是我希望有更优雅的方式来检查输入?特别是因为InputVerifier
可以为组件而不仅仅是文本字段设置。跟踪或自定义焦点并不是真的有帮助,因为几个字段是可选的但仍然是逻辑顺序(所以我不想强迫以不自然的顺序聚焦以确保数据输入)
我考虑过将InputVerifier
添加到包含组件或提交按钮,但同样,我无法解决焦点问题。
答案 0 :(得分:3)
问题是Verifier类在失去焦点的情况下工作,但是对于多个字段,没有什么能确保每个字段都获得焦点。例如,您可以在第一个字段中输入有效的条目,然后单击“提交”,尽管以下字段需要验证。
这是正确的。 InputVerifier仅在组件失去焦点时才起作用。
通常,论坛上有两种类型的编辑:
字段级别修改。这些是编辑以确保组件包含有效数据。这就是数字是数字,邮政编码是否经过适当的格式验证等。这些类型的编辑可以使用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是否有任何输入,并将焦点分配给仍然需要数据的第一个,但我希望那里检查输入是一种更优雅的方式吗?
这是一种非常合理的方法,因为它可以为用户提供问题所在的视觉反馈。