java - MVC 应用程序中的 DocumentListener 验证错误

标签 java swing

我正在制作一个 Swing MVC 应用程序,以了解使用 Swing 框架进行 GUI 设计的复杂性。我的 JDK 版本是 7,我有一个简单的应用程序,其中包含一个对话框,其中有一个用于存储文件路径的文本字段、一个浏览按钮、2 个用于用户 ID 和密码的文本字段以及 2 个用于更新和取消功能的按钮。

单击这些按钮只会显示一个带有“更新”或“取消”消息的对话框。

我计划使用 DocumentListener 来验证文本字段组件。

在 UI 中,我使用以下代码来创建 2 个文本字段:

public JPasswordField getMyPasswordField() {
        if(myPasswordField == null)
        {
            myPasswordField = new JPasswordField();
            myPasswordField.setBounds(133, 93, 163, 21);
            myPasswordField.getDocument().putProperty("Owner", "myPasswordField");
        }
        return myPasswordField;
    }


public JTextField getMyUserNameField() {
        if(myUserNameField== null)
        {
            myUserNameField = new JTextField();
            myUserNameField.setBounds(133, 66, 163, 21);

            myUserNameField.getDocument().putProperty("Owner", "myUserNameField");

        }
        return myUserNameField;
    }

在 Controller 中我使用了以下代码:

myReferenceUI.getMyUserNameField().getDocument().addDocumentListener(this);
myReferenceUI.getMyPasswordField().getDocument().addDocumentListener(this);

在方法实现中我编写了以下内容:

public void insertUpdate(DocumentEvent e) {

        Object owner = e.getDocument().getProperty("Owner");
         changed(owner);

         }
    @Override
    public void removeUpdate(DocumentEvent e) {

        Object owner =e.getDocument().getProperty("Owner"); 
        changed(owner);

    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        Object owner =e.getDocument().getProperty("Owner"); 
        changed(owner);

    }

   public void changed(Object e)

   {

       System.out.println(e.toString());

     if(  e.toString().equals("myUserNameField"))
     {
         if(myReferenceUI.getMyUserNameField().getText().equals("") )
         {
             myReferenceUI.getMyUpdateButton().setEnabled(false);
             return ;
         }

     }

         if(  e.toString().equals("myPasswordField"))
         {
             if(myReferenceUI.getMyPasswordField().getText().equals("") )
             {
                 myReferenceUI.getMyUpdateButton().setEnabled(false);
                 return ;
             }

         }

          myReferenceUI.getMyUpdateButton().setEnabled(true);    

}

我的目的是仅当用户名和密码的 2 个文本框具有非空值时才启用更新按钮。

监听器事件正确触发,并且在用户名/密码字段中输入空值的情况下禁用更新按钮。

但是在这些字段中输入任何值后,如果我按退格键并删除文本,更新按钮将保持禁用状态。

我该怎么做才能摆脱这种状况?

最佳答案

使用一个DocumentListener来识别您想要关注的两个文档。例如:

private static class PasswordValidator implements DocumentListener {
    private final Document[] documents;
    private final JComponent component;

    PasswordValidator(JComponent component, Document... docs) {
        this.component = component;
        documents = docs;
        for (Document doc : docs) {
            doc.addDocumentListener(this);
        }
        validate();
    }

    @Override
    public void insertUpdate(DocumentEvent e) {
        validate();
    }

    @Override
    public void removeUpdate(DocumentEvent e) {
        if (e.getDocument().getLength() == 0) {
            component.setEnabled(false);
        }
    }

    @Override
    public void changedUpdate(DocumentEvent e) {
        // Attribute change - ignore
    }

    private void validate() {
        for (Document doc : documents) {
            if (doc.getLength() == 0) {
                component.setEnabled(false);
                return;
            }
        }
        component.setEnabled(true);
    }
}

然后将使用该特定的实现,例如:

new PasswordValidator(myReferenceUI.getMyUpdateButton(), myReferenceUI.getMyUserNameField().getDocument(), myReferenceUI.getMyPasswordField().getDocument());

关于java - MVC 应用程序中的 DocumentListener 验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19975499/

相关文章:

Java split() 一个由您要拆分的字符串组成的字符串?

java - 使用 EclEMMA 的 Catch block 的代码覆盖率

java - 在 Java Map 中插入新元素或通过其键更新现有元素

java - 在直线上绘制一个具有特定角度的字符串

Java Swing - 鼠标进入JFrame后组件消失

java - 绘制 Jpanel 的边框而不调整内容大小 (Java)

java - 收缩调试多 Dex 组件;无法读取目录/allclasses.jar

java - 如何最小化 eclipse java tomcat 中的堆栈跟踪?

java - 你如何增加面板宽度?

java - 如何从类中调用 JFrame?