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

单击这些按钮仅显示一个对话框,上面带有“更新”或“取消”消息。

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

在用户界面中,我具有以下代码来创建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键并清除文本,则更新按钮将保持禁用状态。

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

最佳答案

使用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/

10-10 02:36