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

时间:2013-11-14 10:39:29

标签: java swing

我正在制作一个摇摆MVC应用程序,以了解使用Swing Framework进行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;
    }

在控制器中我使用了以下代码:

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个文本框具有非空值时才启用更新按钮。

侦听器事件正常触发,如果用户名/密码字段中出现空值,则禁用更新按钮。

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

我能做些什么来摆脱这种情况?

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

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

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

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

    myReferenceUI.getMyUpdateButton().setEnabled(true);

}