0

我正在制作一个 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;
    }

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

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

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

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

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

4

2 回答 2

2

使用DocumentListener了解您要遵循的两个文档的 a。例如:

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());
于 2013-11-14T11:12:21.840 回答
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);

}
于 2013-11-15T04:42:00.537 回答