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

Java MVC应用程序中的DocumentListener验证错误,java,swing,Java,Swing,我正在制作一个swing MVC应用程序,以了解使用swing框架进行GUI设计的复杂性。我的JDK版本是7,我有一个简单的应用程序,其中包含一个对话框,其中有一个用于存储文件路径的文本字段、一个浏览按钮、两个用于用户id和密码的文本字段以及两个用于更新和取消功能的按钮 单击这些按钮只会显示一个对话框,上面有更新或取消消息 我计划使用DocumentListener来验证textfield组件 在UI中,我使用以下代码创建2个文本字段: public JPasswordField getMyPa

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

单击这些按钮只会显示一个对话框,上面有更新或取消消息

我计划使用DocumentListener来验证textfield组件

在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;
    }
在控制器中,我使用了以下代码:

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

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

如果用户名/密码字段中输入为空,侦听器事件将正确触发,并且更新按钮将被禁用

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


如何才能消除这种情况?

使用一个
文档监听器
,该监听器知道您要遵循的两个文档。例如:

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

我通过将PropertyChangedListeners附加到用户名和密码字段以及以下代码位来解决问题:

public void setUpdateButtonState()
    {
        if((myReferenceUI.getMyUserNameField().getText().equalsIgnoreCase("")
                || String.valueOf(myReferenceUI.getMyPasswordField().getPassword())
                        .equalsIgnoreCase("")  ))

{
    myReferenceUI.getMyUpdateButton().setEnabled(false);
}
else
{

    myReferenceUI.getMyUpdateButton().setEnabled(true);

}

空项是什么意思?@Sage这表示用户名/密码字段为空