Est-ce un bon moyen d'utiliser l'interface PropertyChangeListener ?
-
20-12-2019 - |
Question
J'ai un doute lié au sens profond et à l'utilisation du fireIndexedPropertyChange() méthode qui déclenche un événement qui sera intercepté et géré par un propriétéChange() auditeur que je déclare dans une autre classe.
Par exemple, dans une classe qui implémente une interface graphique de connexion (qui affiche un formulaire de connexion) avec un JButton, j'ai cette méthode qui est exécutée lorsque l'utilisateur clique sur mon bouton :
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("Button cliccked");
Main listener = new Main(); // I intantiate a new Main object to have the PropertyChangeListener
this.addPropertyChangeListener(listener); // I add the PropertyChange Listener to this LoginFrame object
/* I fire a PropertyChange: the event start and will be handled by the propper propertyChange() method definied in the
* listener class:
*
* @param "loginButtonClicked"
* */
firePropertyChange("loginResult", false, loginResult);
}
Ainsi, lorsque l'utilisateur non encore connecté clique sur mon bouton, cette méthode est exécutée et déclenche un nouveau PropriétéChange événement.
Mon PropriétéChange l'événement prend lui-même les informations suivantes :
Le nom de la propriété c'est le nom d'une propriété qui pourrait être modifiée (dans mon exemple, elle s'appelle connexionRésultat parce que j'ai une variable booléenne nommée connexionRésultat et la valeur est vraie si l'utilisateur peut se connecter en cliquant sur le bouton, fausse sinon
Un ancienne valeur est l'ancienne valeur de la propriété qui pourrait être modifiée (dans mon exemple c'est faux car si l'utilisateur voit les fenêtres de connexion cela signifie qu'il n'est pas connecté et que loginResul = faux
Le nouvelle valeur:dans ce cas, c'est le contenu du connexionRésultat variable (vrai si l'utilisateur est connecté au système)
Donc ça PropriétéChange l'événement sera intercepté par mon propriétéChange() méthode (déclarée dans une classe d'écoute) qui le gère en fonction de ces paramètres :par exemple de la manière suivante :
** si le propertyName est loginResult et si la nouvelle valeur est true alors n'affichez plus la fenêtre de connexion mais affichez la fenêtre principale de l'application **
Mon raisonnement est-il correct et cela pourrait être une bonne façon d'utiliser le PropertyChangeListener interface?
Transmission
Andréa
La solution
Vous pouvez l'utiliser comme ça et cela fonctionnera.Mais je pense que votre question concerne davantage la sémantique que la simple question de savoir si cela fonctionne.Le package de cette interface est java.beans
ce qui le place dans un contexte de haricots.Si vous l'utilisez dans un contexte de beans, c'est-à-direvotre éditeur d'événement est un haricot alors je pense que le "sens profond" de l'interface est en accord avec votre utilisation.Le javadoc dit
Un événement "PropertyChange" est déclenché chaque fois qu'un bean modifie une propriété "liée".
Si vous ne pensez pas que cela se marie bien avec les haricots, créez le vôtre
Autres conseils
Il n'y a aucune raison d'utiliser des événements pour mettre en œuvre votre cas d'utilisation.Vous survenez des choses simples.Le code devrait simplement ressembler à ce qui suit:
@Override
public void actionPerformed(ActionEvent e) {
String login = loginTextField.getText();
char[] password = passwordField.getPassword();
boolean loginSuccessful = authenticationService.authenticate(login, password);
if (loginSuccessful) {
Main main = new Main();
main.setVisible(true);
this.setVisible(false);
}
else {
displayErrorMessage("Login failed");
}
}