2016-07-12 4 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를 마지막으로 변경하도록합니다. 즉, 그것이 상수가되어 더 이상 내 목적에 봉사하지 않는다는 것을 의미합니다.

왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

+0

익명의 내부 클래스에서 'c'를 사용하고 있기 때문에 상황이 발생합니다. – Arjan

+0

익명의 내부 클래스에서 외부 클래스의 변수를 사용하고 있습니다. 이러한 변수는 '최종'이어야합니다. 'Runnable'을 구현하고 생성자 또는 다른 방법으로'c'를 전달하는 "* 실제 *"클래스를 만듭니다. –

+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); 
    } 

} 

출력 :

안녕하세요!
c = 0
Hello World!
c = 1
Hello World!
c = 0

+0

감사합니다. 이제 이해하겠습니다. –

+0

'c'가 다른 클래스의 인스턴스 변수라고 가정하면이 작업이 가능합니까? –

+1

예 인스턴스가 메서드에서 로컬 인 경우에도 작동합니다. 일부 버전 (어떤 버전인지 모르기 때문에)은 로컬 선언문을 최종 선언 할 필요는 없지만 효과적으로 마무리해야합니다. 즉, 부작용없이 최종 버전을 추가 할 수 있습니다. – Clayn