【问题标题】:Enable Jbutton only if Validation is True仅当 Validation 为 True 时才启用 Jbutton
【发布时间】: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 完全正确。这就是我在这里遇到的问题。我会试试你的建议。

标签: java swing validation jbutton


【解决方案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);
        }
    });

【讨论】:

  • 感谢您的回复。不,我还没有尝试过这样的事情。我会试试这个,让你知道。
  • @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(...));尽快通知您
    猜你喜欢
    • 2020-10-13
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多