Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1971 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  JAVA Variable final ???

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

JAVA Variable final ???

n°2309524
erwan83
Du Shift DEL tu te méfieras !
Posté le 03-01-2018 à 14:11:18  profilanswer
 

On a tous débuté...
 
Je veux faire "clignoter" mon rectangle"
Dans ma class je voudrais déclarer une variable string égale à la couleur.
Si la variable == WHITE on change la couleur en RED et vice versa....
Le compilateur me dit ça:
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: Uncompilable source code - local variables referenced from an inner class must be final or effectively final
 at javaapplication1.Main$1.handle

Evidemment si je lui demande de mettre en final la variable, il ne veut pas fonctionner non plus..
 

Code :
  1. public class Main extends Application {
  2.    public void start(Stage stage)
  3.    {
  4.        String Couleur_L1C2 = "WHITE";
  5.      
  6.        System.out.println("OUVERTURE" );
  7.        Date debut = new Date();
  8.        System.out.println(debut);
  9.      
  10.        Group root = new Group();
  11.        Scene scene = new Scene(root, 805, 805, Color.BLACK);
  12.      
  13.        Rectangle L1C2 = new Rectangle(205,5,95,95);
  14.        L1C2.setFill(Color.WHITE);
  15.      
  16.        L1C2.setOnMouseClicked(new EventHandler<MouseEvent>()
  17.         {
  18.             public void handle(MouseEvent t) {
  19. // CONDITION ICI
  20.                 L1C2.setFill(Color.RED);
  21.                 Couleur_L1C2 = "RED";
  22. // FIN CONDITION
  23.             }
  24.         });
  25.      
  26.        root.getChildren().add(L1C2);


---------------
http://www.ilyks.com
mood
Publicité
Posté le 03-01-2018 à 14:11:18  profilanswer
 

n°2309525
TotalRecal​l
Posté le 03-01-2018 à 14:17:41  profilanswer
 

Je bite rien au java mais je dirais qu'il n'aime pas que passes à ton délégué une variable locale de la méthode qui déclare le délégué, ce qui passerait uniquement si cette variable était une constante. Ce qui parait tout à fait logique.

 

C'est pas plutôt un truc genre L1C2.setFill(Color.RED); que tu devrais appeler au lieu de triturer cette malheureuse variable innocente ? Ou une variable privée de la classe ? (même si je suis sûr que tu peux faire sans variable !)


Message édité par TotalRecall le 03-01-2018 à 14:18:49

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2309530
DDT
in trollo veritas
Posté le 03-01-2018 à 15:31:53  profilanswer
 

TotalRecall a raison, et non c'est pas forcément logique si tu viens d'un langage avec des vraies closures. :D
Tu peux en effet sortir ta variable d'état et en faire un membre te ta classe Main, car du coup ton listener va y accéder indirectement, à travers la référence vers la classe externe (qui est finale).
Ou plus simplement:

Code :
  1. public class Main extends Application {
  2.     @Override
  3.     public void start(Stage stage) {
  4.         System.out.println("OUVERTURE" );
  5.         Date debut = new Date();
  6.         System.out.println(debut);
  7.         Group root = new Group();
  8.         Scene scene = new Scene(root, 805, 805, Color.BLACK);
  9.         Rectangle L1C2 = new Rectangle(205, 5, 95, 95);
  10.         L1C2.setFill(Color.WHITE);
  11.         L1C2.setOnMouseClicked(mouseEvent -> {
  12.             // CONDITION ICI
  13.             if (L1C2.getFill().equals(Color.RED)) {
  14.                 L1C2.setFill(Color.WHITE);
  15.             } else {
  16.                 L1C2.setFill(Color.RED);
  17.             }
  18.         // FIN CONDITION
  19.         });
  20.         root.getChildren().add(L1C2);
  21.         stage.setScene(scene);
  22.         stage.show();
  23.     }
  24.     public static void main(String[] args) {
  25.         launch(args);
  26.     }
  27. }


 
Ça marche chez moi.
 


---------------
click clack clunka thunk
n°2309531
TotalRecal​l
Posté le 03-01-2018 à 15:41:37  profilanswer
 

On peut débattre de la capture de variables locales par les closures selon le langage mais là à mon avis on a affaire à un débutant donc le souci ne vient pas de là :d.

 

J'avais la flemme de vérifier si getFill se disait effectivement getFill mais je ferais aussi un truc comme le tiens, c'est ce à quoi je pensais en disant que la variable n'est pas indispensable.
Après l'utilisation d'une variable distincte c'est bien aussi (pas pour un cas aussi simple où on veut juste switcher la couleur, mais parfois, quand tu dois gérer des états logiques plus complexes). L'important est que Erwan comprenne ce que ça fait.

 


Message édité par TotalRecall le 03-01-2018 à 15:42:11

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2309551
erwan83
Du Shift DEL tu te méfieras !
Posté le 03-01-2018 à 18:02:53  profilanswer
 

Merci à vous deux, en effet je développe beaucoup en Python et le premier langage que j'ai abordé était le VB avec des variables globales donc le soucis n'est pas (merci TotalRecall) de savoir si je connais getFill mais de savoir comment se passent les variables en Java


---------------
http://www.ilyks.com

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  JAVA Variable final ???

 

Sujets relatifs
Script JAVA sous Google SHEETS[Java/SQL] JPA et contraintes de clef etrangere
[JAVA EE] Liste Déroulantes Liées ServletJAVA Ftp Quartz
Problème Main en java avec XML eclipse[RESOLU] VBA - Tag d'1 var bidimensionnelle sur 1 librairie SharePoint
gestion des collisions dans jeu en 2D javaMon premier dev java sous Android
executer un script en python en variable?interface en java
Plus de sujets relatifs à : JAVA Variable final ???


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR