2016-07-12 15 views
0

私の問題は、基本的に私が理解できないJava言語からです。 これは、Platform.runlaterメソッドを使用してGUIを更新するという概念を理解するための基本的なコードです。Javafx Guiの更新

package practise; 

import java.util.Random; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Line; 
import javafx.stage.Stage; 

public class Practise extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     final Line l1 = new Line(200,80,200,0); 
     final int c = 0;   

     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 

       Platform.runLater(new Runnable() { 
        Random rn = new Random(); 
        @Override 

        public void run() { 
         if(c==0) 
         { 
          l1.setStartX(rn.nextInt(400)); 
          l1.setStartY(rn.nextInt(400)); 
          c = 1; 
         } 
         else 
         { 
          l1.setEndX(rn.nextInt(400)); 
          l1.setEndY(rn.nextInt(400)); 
          c = 0; 
         } 
        } 
       }); 
      } 
     }); 


     l1.setStroke(Color.YELLOW); 
     l1.setStrokeWidth(2); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     root.getChildren().add(l1); 

     Scene scene = new Scene(root, 400, 400, Color.WHITE); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

これは私のコードです。私は、線の始点または終点を交互に変更したいと考えています。そのために、私はボタンを押すたびに値を変更する変数 'c​​'を作成しました。

しかし、問題はコンパイラがint型をfinalに変更することです。つまり、それは一定になり、もはや私の目的に役立たないということです。

なぜこのようなことが起こり、どうすれば回避できますか?

+0

匿名の内部クラスで 'c'を使用しているために起こっています。 – Arjan

+0

匿名の内部クラスで外部クラスの変数を使用しています。そのような変数は 'final'でなければなりません。 'Runnable'を実装し、そのコンストラクタまたは他の方法で' c'を渡す '* real * 'クラスを作成します。 –

+0

この問題を回避するにはどうすればよいですか? –

答えて

1

匿名の内部クラスでローカルスコープの変数を使用しています。変数がfinalの場合にのみこれを行うことができます。変数の値を変更する必要がある場合は、変数をインスタンス変数として定義できます。

public class MainApp extends Application { 

    private int c; 

    @Override 
    public void start(Stage primaryStage) { 
     Button btn = new Button(); 
     final Line l1 = new Line(200,80,200,0); 

     btn.setText("Say 'Hello World'"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       System.out.println("Hello World!"); 

       Platform.runLater(new Runnable() { 
        Random rn = new Random(); 
        @Override 

        public void run() { 
         if(c==0) 
         { 
          System.out.println("c=" + c); 
          l1.setStartX(rn.nextInt(400)); 
          l1.setStartY(rn.nextInt(400)); 
          c = 1; 
         } 
         else 
         { 
          System.out.println("c=" + c); 
          l1.setEndX(rn.nextInt(400)); 
          l1.setEndY(rn.nextInt(400)); 
          c = 0; 
         } 
        } 
       }); 
      } 
     }); 


     l1.setStroke(Color.YELLOW); 
     l1.setStrokeWidth(2); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     root.getChildren().add(l1); 

     Scene scene = new Scene(root, 400, 400, Color.WHITE); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 

} 

ボタンクリックのカップルの後に出力:

のHello World!
c = 0
Hello World!
c = 1
Hello World!
c = 0

+0

ありがとうございます。今では私が理解している –

+0

'c'が別のクラスのインスタンス変数であると仮定すると、これは動作しますか? –

+1

はいこれは、インスタンスがメソッド内でローカルであっても機能します。いくつかのバージョン(どちらが分かっているか分からないので)では、ローカル変数をfinal宣言する必要はありませんが、効果的にfinalでなければなりません。つまり、副作用なしにfinalを追加することができます – Clayn

関連する問題