仅当 Validation 为 True 时才启用 Jbutton

Posted

技术标签:

【中文标题】仅当 Validation 为 True 时才启用 Jbutton【英文标题】:Enable Jbutton only if Validation is True 【发布时间】:2013-04-21 12:15:12 【问题描述】:

验证 Swing 应用程序的输入字段(例如文本字段、组合框等)并让用户仅在一切正常时才按下保存按钮的最佳方法是什么。假设 Search 功能也在同一个界面中。所以搜索记录也会填满输入字段。但在这种情况下,保存按钮应保持禁用状态。

initComponents();
        btnSave.setEnabled(false);

        txt1.getDocument().addDocumentListener(new DocumentListener() 
              @Override
              public void changedUpdate(DocumentEvent e) 

              

              @Override
              public void removeUpdate(DocumentEvent e) 
                    validate(txt1.getText(),e);
              

              @Override
              public void insertUpdate(DocumentEvent e) 
                    validate(txt1.getText(),e);
              

              public void validate(String enteredText,DocumentEvent e) 
                    String currText = "";
                    try 
                          Document doc = (Document) e.getDocument();
                          currText = doc.getText(0, doc.getLength());
                     catch (BadLocationException e1) 
                    

                    if(enteredText.equals(currText))
                      //if validated successfully
                           btnSave.setEnabled(false);
                    else
                    btnSave.setEnabled(true);
                    
              
        );

【问题讨论】:

@vishal_aim 我在表单加载时将启用设置为 false。然后在验证方法结束时为 Save 按钮设置 enable true。然后我在最后一个文本字段的按下事件中调用了 Validate 方法。 如果用户填写了最后一个文本字段并清除了前面的文本字段之一怎么办?然后您需要将该操作添加到所有输入元素。 @GnomezGrave 完全正确。这就是我在这里遇到的问题。我会试试你的建议。 【参考方案1】:

你试过这样吗?

    final JTextField textField = new JTextField();
    final JButton submitBtn = new JButton();
    submitBtn.setEnabled(true);

    textField.getDocument().addDocumentListener(new DocumentListener() 
        public void changedUpdate(DocumentEvent e) 
            validate(e);
        
        public void removeUpdate(DocumentEvent e) 
            validate(e);
        
        public void insertUpdate(DocumentEvent e) 
            validate(e);
        

        public void validate(String enteredText) 
            String currText = "";
            try 
                Document doc = (Document)e.getDocument();
                currText = doc.getText(0, doc.getLength());
             catch (BadLocationException e1) 
                e1.printStackTrace();
            
            //validation of currText here

            //if validated successfully
            submitBtn.setEnabled(true);
            //else
            submitBtn.setEnabled(false);
        
    );

【讨论】:

感谢您的回复。不,我还没有尝试过这样的事情。我会试试这个,让你知道。 好主意,但我不喜欢这样,please to see proper (my view), because String could be inserted from ClipBoard, or previously selected text can be deleted too @vishal_aim 我尝试使用你给我的代码。但这对我不起作用。对不起,我还是 java 初学者。你能看看我的代码吗?我更新了原帖 谢谢,更新了代码。 @user2033382,你可以像现在这样尝试,纯文本组件不会触发 changedUpdate 事件。 @vishal_aim 感谢您的更新。我知道我必须围绕 documentlistner 工作才能获得预期的结果。我第一次尝试这个。我根据您更新的代码编辑了我以前的代码。但仍然没有运气。 :( 我更新了原帖。你能看看我哪里搞砸了。【参考方案2】:

在两个地方使用setEnabled() 调整Save 按钮的enabled 属性:

shouldYieldFocus() 的实现中,附加到每个相关组件的InputVerifier 中。教程和部分示例引用here。

在组件的普通监听器中。

【讨论】:

【参考方案3】:

创建一个方法来检查所有输入是否已完成或/和所有验证是否通过并最终返回一个布尔值。

public boolean validate(...)
   //some stuff
   if(validated)
     return true;
   else
     return false;
   

那么你就可以使用它了。

button.setEnabled(validate(...));

【讨论】:

感谢您的回复。我已经尝试过这样的事情。但没有像这样尝试。 button.setEnabled(validate(...));尽快通知您

以上是关于仅当 Validation 为 True 时才启用 Jbutton的主要内容,如果未能解决你的问题,请参考以下文章

仅当条件为 True 时才在 python 中使用 Eel 调用 JavaScript 函数

SwiftUI:仅当输入不为空时才启用保存按钮

仅当所有文本字段都已填写时才在 Swift 中启用按钮

仅当侦听器为该提供者注册时才调用 onProviderEnabled 吗?

仅当一个查询中存在关系时才过滤 ManyToManyField

仅当应用程序在后台请求位置后进入前台时才调用 didUpdateLocations