2013-11-14 3 views
0

Я создаю приложение MVC для качания, чтобы узнать тонкости графического интерфейса с использованием Swing Framework. Моя версия JDK - 7, и у меня есть простое приложение, содержащее диалоговое окно с текстовым полем для хранения пути к файлу, кнопкой обзора, 2 текстовыми полями для идентификатора пользователя и пароля и 2 кнопками для функций обновления и отмены.Ошибка проверки подлинности DocumentListener в приложении MVC

Нажатие на эти кнопки просто показывает диалоговое окно с сообщением «Обновить» или «Отмена» на нем.

Я планировал использовать 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);  

}

Мое намерение состояло в том, чтобы включить кнопку обновления, только если 2 текстовых поля для имени пользователя и пароля имеют ненулевые значения.

События прослушивателя должным образом срабатывают, и кнопка обновления отключена в случае нулевой записи в полях имени пользователя/пароля.

Но после ввода любого значения в этих полях, если я нажимаю клавишу «Назад» и стирает текст, кнопка обновления остается отключенной.

Что я могу сделать, чтобы избавиться от этого состояния?

+0

Что вы подразумеваете под нулевой регистрацией? – Sage

+0

@Sage Это означает, что любое из полей имени пользователя и пароля пустое – user2991608

ответ

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()); 
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); 

} 
Смежные вопросы