gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:32:07 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com