当前位置: 首页 > 知识库问答 >
问题:

在UI上进行数据验证时如何“忽略/丢弃”SwingUI事件?

公冶峰
2023-03-14

有一个文本字段,当失去焦点时,它将验证输入,如果没有传递,则打印出错误消息(简单地说,这里只有一个空检查)。文本字段旁边有一个按钮,单击它就会打印出文本。

正如我所尝试的,当输入一些文本然后单击按钮时,它会触发文本字段的焦点丢失事件和按钮事件。换句话说,它将首先进行验证,然后打印出输入的文本。

我的问题来了,如果验证未通过,防止打印文本的好方法是什么?或者如果验证未通过,是否有办法“忽略”按钮上的单击事件?

我尝试使用一个布尔标志来指示验证结果并在执行操作for按钮时检查标志,但我认为这不是一个好方法。因为我知道Swing中有一个事件调度程序线程来处理事件,我可以从这里取消事件吗?

下面是一段解释问题的代码:

public class SimpleDemo
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel content = new JPanel(new FlowLayout());
        frame.setContentPane(content);

        final JTextField textField = new JTextField(10);
        textField.addFocusListener(new FocusAdapter()
        {
             @Override
             public void focusLost(FocusEvent e)
             {
                 String text = textField.getText();
                 // do some validation here, if not validated 
                 // do not trigger the event on button.
                 if ("".equals(text))
                 {
                     System.out.print("please input a text!");
                 }
             }
        });
        content.add(textField);

        JButton button = new JButton("Print Text");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                // action performed for button
                String text = textField.getText();
                System.out.println(text);
            }
        });
        content.add(button);

        frame.setVisible(true);
        frame.pack();
    }
}

共有3个答案

燕正卿
2023-03-14

让ui与用户通信总是有意义的。因此,当用户未输入任何内容时,可以将“please input a text”(请输入文本)显示为文本字段的默认文本。以下是此类自定义文本字段的代码:

public class TextFieldWithDefaultText extends JTextField implements FocusListener{

private final String hint;

public TextFieldWithDefaultText (String $text)
{
    super($text);
    this.hint = $text;
    addFocusListener(this);
}

@Override
public void focusGained (FocusEvent $e)
{
    if (this.getText().isEmpty())
    {
        super.setText("");
    }
}

@Override
public void focusLost (FocusEvent $e)
{
    if (this.getText().isEmpty())
    {
        super.setText(hint);
    }
}

@Override
public String getText ()
{
    String typed = super.getText();
    return typed.equals(hint) ? "" : typed;
}

}

为按钮编写ActionListerner,如下所示:

JButton button = new JButton("Print Text");
    button.addActionListener(new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent e)
        {
            if(!textField.getText().isEmpty())
                System.out.println(textField.getText());
        }
    });

和ur text Field实现应该是:

final TextFieldWithDefaultText textField = new TextFieldWithDefaultText ("please input a text");

希望这有助于:)

颜思淼
2023-03-14
  • 启动时禁用按钮
常心水
2023-03-14

我在处理应用程序时也面临类似的问题。我如下所示解决了这个问题,我创建了一个抽象类ApplicationFrame,应用程序中的每个框架都对其进行了扩展

public abstract class ApplicationFrame extends JFrame implements ActionListener {
    @Override
    final public void actionPerformed(ActionEvent event) {
        if(validateInput()){
             performAction(event);
        }
    }

    /*
    * Sub class should override this method to receive any action
    */
    protected void performAction(ActionEvent event) {};

    /*
     * Sub class should override this method to perform validation
    */
    abstract protected boolean validateInput();
}

所有帧现在将扩展此基础帧,如下所示:

public class Frame1 extends ApplicationFrame{
    @Override
    protected void performAction(ActionEvent event) {
        // perform action
    }
    @Override
    protected boolean validateInput() {
        // return true or false depending upon the validation results
    }
    // if you want to add Action Listener, you need to add like this:
    btnSomeButton.addActionListener(this);
}

如果您需要处理Focus事件,您可以使Application ationFrame或基本框架实现Focus usListener。这是我解决问题的自定义实现,希望这有所帮助。

 类似资料:
  • 我尝试使用一个布尔标志来指示验证结果,并在执行按钮操作时检查该标志,但我认为这不是一个好的方法。我知道Swing中有一个事件调度线程来处理这些事件,我可以从这里取消这些事件吗? 下面是一段解释这个问题的代码:

  • 我正在使用Spring MVC制作一个webapp 我的用户模型 我的注册有所有这些字段的表单输入,但是登录只使用用户名和密码。项目需要所有字段。我将登录表单设置为使用接受用户名和密码的构造函数。提交时,它遵循所有用户模型变量的数据验证。登录控制器: 是否可以告诉方法忽略除用户名和密码之外的所有变量?

  • 如果某个接口不需要进行验证工作,可以在@Api注解上设置属性ignoreValidate=true(默认false)。这样调用接口时,不会进行验证操作。 同样的,在@ApiService注解里也有一个对应的ignoreValidate属性,设置为true的话,Service类下面所有的接口都忽略验证。 忽略所有接口验证 设置ApiConfig.setIgnoreValidate(true),所有接

  • 我要求Python从CSV数据列中打印最小数量,但最上面的行是列号,我不希望Python考虑最上面的行。我如何确保Python忽略第一行? 这是目前为止的代码: 你能解释一下你在做什么,而不仅仅是给出代码吗?我对Python非常陌生,希望确保我了解所有内容。

  • 我正在尝试调用一个部署在Linux服务器上的web服务,该服务器具有在.net core中开发并部署在IIS服务器(Windows Server 2012)上的应用程序的自签名证书。 但是当我试图调用endpoint时,抛出了下一个错误: “消息”: “无法建立 SSL 连接,请参阅内部异常。”, “描述”: “内部错误: 系统.安全.身份验证.身份验证异常: 身份验证失败,请参阅内部异常。---

  • 我试图在kotlin中为我的数据模型添加验证,使用注释很容易实现简单的字段。但是,我正在努力做同样的收藏。 我已经在这里将问题上传到了github 如有任何帮助,将不胜感激。谢谢你!