Bonsoir, j'ai un petit problème de variable,
mon ide me signale "variable pause is accessed from within inner class; needs to be declared final ", je ne trouve pas la solution.
boolean pause = false;
playPause = (Button) findViewById(R.id.play);
playPause.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
if (pause) {
pause();
}else{
play();
}
pause = !pause;
}
});
Par avance merci ![]()
La solution c'est " needs to be declared final ". ![]()
C'est ce que j'ai fait mais je ne peux pas modifié ma variable "cannot assign a value to final variable"
Problème de portée de variables (marrant comme ça revient souvent, ce souci).
Ici, tu as 2 classes : ta classe englobante et ton listener en classe anonyme. "pause" est locale à ta méthode, donc seule cette méthode peut y avoir accès, dès sa définition. Le listener étant une autre classe, le bout de code est peut-être "en-dessous", mais c'est une bien une classe différente, elle n'a donc aucun accès à "pause".
En la rendant "final", tu augmentes sa portée en disant "ma variable, là elle ne changera pas, tu peux donc la passer, il n'y aura pas de problème de synchr ou de concurrence".
Clairement, ce n'est pas ce que tu veux, et "pause" avec sa déclaration courante ne fera pas non plus ce que tu veux. Pour ce que je comprends de son utilité, il faut au minimum la déclarer en variable d'instance.
Je te suggères de bien comprendre les notions de programmation événementielle, et de te renseigner sur les portées des variables. Le second est ton problème, le premier pourra t'être utile pour toute création d'interface.
Merci pour ton aide et ta solution, je vais regarder de plus près la programmation événementielle
.
mets la variable pause comme un attribut
Tu peux aussi utiliser le binding de jgoodies (après tu pourras plus t'en passer
)
JGoodies n'est pas pour Android, et c'est la plate-forme qu'il cible.
De plus, je tiens à souligner que fcbneymar fait une erreur de débutant (pas de mal à ça ;) ) sur une notion commune à la plupart des langages de programmation, à savoir la portée des variables. Sortir un framework dans ce contexte est particulièrement déplacé.
Ah oui, j'avais pas vu, ![]()
Bah je me pose pas trop de question, c'est un problème sur lequel on tombe toutes les 10 minutes en java et comme nous on utilise jgoodies, bah la question ne se pose même plus..
Après de là à dire que c'est déplacé, je ne suis pas d'accord, il faudrait être fou pour programmer en java sans jgoodies, mais bon, certains semblent aimer se compliquer la vie alors ![]()
Au lieu de simplement balancer le mot, pourrais-tu expliciter ce que ça te change ?
J'utilise Java pour faire uniquement de l'Android et du JEE. De ce que j'ai compris de JGoodies, ce framework permet de faire de jolies applications basées sur Swing, ce qui correspond à un périmètre assez restreint des applications utilisant Java.
En sus de ça, un poil de Grails (donc Groovy) pour des sites webs. Je ne vois pas l'intérêt de JGoodies pour chacun de ces projets, qui se fait pourtant en Java.
Et si, je persiste et signe, c'est totalement déplacé de proposer un framework pour combler une lacune basique de programmation. Je rappel de nouveau que le problème ici est la portée des variables. Proposer un framework pour remplacer une connaissance tout à fait basique est suicidaire.
De plus, je rappel et signal qu'il ne faut pas tomber dans la "framework-ite aigüe", maladie assez grave consistant à toujours prendre un framework sans se poser la question si c'est faisable à la main, accouchant de superbes usines à gaz possédant un nombre ahurissant de dépendances, la plupart étant utilisées pour une seule fonctionnalité/méthode, soit moins de 10%.
Alors déjà jgoodies est loin d'être une usine a gaz... Après dans l'informatique fait savoir rester humble (une très grande qualité que beaucoup oublie au fur a mesure que leur chevilles enfle)
Bref le binding de jgoodies ça change la vie. Après je vais pas faire un cours sur ce qu'est jgoodies, je dis juste qui faut l'essayer avant de sortir des bêtises. Je persiste et signe également ![]()
Je plussoie complètement Bunyan sur ses deux derniers paragraphes. Je ne connais pas JGoodies mais normalement on utilise un framework si on en a besoin, pas juste pour deux-trois fonctionnalités car ça c'est complètement contre-productif contrairement à ce que tu soutiens. Et si en plus les fonctionnalités que tu utilises sont dues au fait que tu maîtrises mal Java de base, c'est encore pire.
Donc je ne connais pas JGoodies je le redis, mais dans ce cas précis c'est pas la bonne solution ni même une solution acceptable.
De toute façon, ce n'est pas utilisable pour android, il n'y a donc pas à tergiverser. Ce que je voulais juste mettre en avant c'est la partie binding de jgoodies qui est une merveille et ce n'est en tout ca pas un framework orienté web.. Bref faut l'essayer pour savoir de quoi on parle, sans ça, ça sert à rien
Ca partie formulaire permer de faire des interface ui sans trop se prendre la tête, alors oui ce n'est pas obligatoire pour faire des applications java, mais comme je l'ai déjà dit, si les gens aiment se compliquer la vie ![]()
Je tiens à insister sur un point : je ne reproche absolument pas de n'avoir pas vu que c'était pour de l'Android. Ce n'est pas précisé, et il faut en avoir fait pour reconnaître le "findViewById".
Donc en résumé : "Utilise JGoodies, ça ne correspond absolument pas à ton besoin et ne réponds pas à ta question, mais ce framework est génial !".
Note que JGoodies n'a pas été critiqué. Il est peut-être totalement génial, je n'en sais rien et me garderai bien de donner un avis uniquement sur les snippets montrés sur le site.
Si tu veux en faire la promotion, libre à toi, mais fais-le où ça pourrait avoir un intérêt, et fais-le bien, ne te content pas de dire "c'est trop bien". A titre personnel, je te remercie de me l'avoir fait découvrir (l'écosystème Java est tellement vaste), mais la manière dont tu le vends/l'amène/le promeut tendrai à faire fuir.
Tu restes sur l'argument "si les gens aiment se compliquer la vie", je te repose donc exactement la même question : "pourrais-tu expliciter ce que ça te change ?"
Un petit pdf explicatif de ce qu'est le databinding :
http://www.jgoodies.com/download/presentations/binding.pdf
Admettons que tu aies une fenêtre qui ne gère qu'un objet de type de Personne (nom, prénom, age, ...). Et tu veux activer un bouton uniquement si l'age de la personne sur cette même fenêtre, si l'age de la personne >= 18.
Et bien tu feras :
getPresentationModel.getBean().addPropertyChangeLi
stener(Personne.AGE,
new propertyChangeListener() {
// if e.getValue() >= 18, alors activer bouton
});
Car dans le getter/setter de ton objet Personne, tu auras préalablement poser un firepropertychange (La méthode firePropertyChange() permet d'informer tous les composants enregistrés du changement de la valeur de la propriété).
C'est quand même plus simple que d'attendre que l'utilisateur quitte le champs Age pour connaitre la valeure saisie, ici on est directement notifié dès que la valeur change.
Laquelle des deux méthode prèfères-tu ?
getPresentationModel.getBean().addPropertyChangeLi
stener(Personne.AGE,
new propertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
// if e.getValue() >= 18, alors activer bouton
}
});
ou alors:
getChampsAge.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {}
@Override
public void focusLost(FocusEvent e) {
// if getPersonne.getAge() >= 18, alors activer bouton
}
});
Et par rapport au message initial, j'ai mis jgoodies sur le tapis (je le repete, je n'utilise que ca), tu peux facilement faire
final monPm = ....;
puis dans ton listener :
monPm.getBean().setAge(x)
plus de limitation au niveau de la portee de la variable, puisque c'est un modele ![]()
Le framework est surement bien (comme tout le monde te le dit) mais t'a pas l'air de comprendre que le problème de l'OP c'est la compréhension de ce qui se passe dans son code.
En utilisant un framework qui résout magiquement les problèmes (assez simple en l'occurrence) ça donne des programmeurs un peu merdique à mon avis. Surtout que pour bien utiliser un framework il faut comprendre un minimum ce qu'il fait en interne, chose qui - à mon avis - est larrrgement plus complexe qu'un problème de portée.
Personnellement c'est probable que j'utilise ce genre de framework pour mes prochains dev, mais seulement parce que je maîtrise suffisamment swing et que j'ai pas envie de taper 500 lignes de code verbeux pour faire du binding.
Merci de l'explication.
De ce que je comprends, il fait un pattern Observer automatiquement avec liaison des propriétés. Ca pourrait effectivement être intéressant, si les contrôles sont eux aussi possibles (restriction de tailles, types...).
A titre personnel, je déteste cordialement les accesseurs faisant plus qu'un get/set.
Déjà eu de très mauvaises surprises avec des getter faisant du lazy loading et des appels réseaux à tire-larigot...
Pour ton exemple, je ferai plutôt un TextListener personnellement, sauf si la notion de focus est strictement obligatoire (ce que client veut absolument contre vents et marées...).
"plus de limitation au niveau de la portee de la variable, puisque c'est un modele
"
Tout a fait... mais quand on ne connait pas la notion de "portée", on contourne le problème sans véritablement l'adresser puisque la notion n'est pas acquise ni comprise, et que celle-ci fait partie de la base. C'est un bon moyen, à mon avis, de se retrouver confronter au même problème peu de temps après et de systématiquement faire la même implémentation, qui ne sera sans doute pas adaptée (sauf chance).
De ce que je comprends, il fait un pattern Observer automatiquement avec liaison des propriétés. Ca pourrait effectivement être intéressant, si les contrôles sont eux aussi possibles (restriction de tailles, types...).
-> Oui et ils le sont! Jgoodies permet aussi la validation des données (mettre un champs en erreur, ne pas sauver l'enregistrement tant qu'il est en erreur, afficher un message d'erreur ...)
Pour faire des choses dans ce gout là par exemple:
http://www.java2s.com/Code/Java/Swing-Components/ValidationHowtoExample.htm