gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:26:52 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

The problem is that the Verifier class works on condition of losing focus, but with multiple fields nothing ensures that each gets focus in the first place. For example you could enter a valid entry into the first field, and click submit, despite verification being needed on the following fields.

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

通常,在论坛上进行两种类型的编辑:

  1. 字段级别编辑。这些编辑是为了确保组件包含有效数据。也就是说,数字就是数字,验证邮政编码的格式是否正确等。这些类型的编辑可以通过使用 InputVerifier 来完成

  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();
}
});
}
}

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

I'm sure I could rig something together, whereby when the submit button is pressed it checks the relevant JTextAreas for any input at all and assigns focus to the first one that still requires data, but I was hoping that there was a more elegant way to check input?

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

关于java - 验证可能无法获得焦点的 JTextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43762086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com