JAVA Variable final ???

JAVA Variable final ??? - Java - Programmation

Marsh Posté le 03-01-2018 à 14:11:18    

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.ypikay.com
Reply

Marsh Posté le 03-01-2018 à 14:11:18   

Reply

Marsh Posté le 03-01-2018 à 14:17:41    

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
Reply

Marsh Posté le 03-01-2018 à 15:31:53    

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
Reply

Marsh Posté le 03-01-2018 à 15:41:37    

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
Reply

Marsh Posté le 03-01-2018 à 18:02:53    

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.ypikay.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed