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