2017-01-30 10 views
1

円を作成し、4つのボタン(左、右、上と下)で移動するためのコードは、その新しい位置から移動するのではなく、その開始位置(y = 0およびx = 0)から始める。円は新しい位置から開始位置から移動しません

package movetheball; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.stage.Stage; 
import javafx.geometry.Pos; 

public class MoveTheBall extends Application { 

@Override 
public void start(Stage primaryStage) throws Exception { 

    Circle circle = new Circle(); 

    circle.setRadius(50); 
    circle.setStroke(Color.BLACK); 
    circle.setFill(Color.WHITE); 

    Button btn1 = new Button(); 
    btn1.setText("Left"); 
    btn1.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      double newY = 0; 
      double newX = 0; 
      System.out.println("Went to the left."); 
      newX = circle.getCenterX() - 10; 

      circle.setTranslateX(newX); 
      circle.setTranslateY(newY); 
     } 
    }); 

    Button btn2 = new Button(); 
    btn2.setText("Right"); 
    btn2.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      double newY = 0; 
      double newX = 0; 
      System.out.println("Went to the right."); 
      newX = circle.getCenterX() + 10; 

      circle.setTranslateX(newX); 
      circle.setTranslateY(newY); 
     } 
    }); 

    Button btn3 = new Button(); 
    btn3.setText("Up"); 
    btn3.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      double newY = 0; 
      double newX = 0; 
      System.out.println("Went up."); 
      newY = circle.getCenterY() - 10; 

      circle.setTranslateX(newX); 
      circle.setTranslateY(newY); 
     } 
    }); 
    Button btn4 = new Button(); 
    btn4.setText("Down"); 
    btn4.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      double newY = 0; 
      double newX = 0; 
      System.out.println("Went down."); 
      System.out.println("Went up."); 
      newY = circle.getCenterY() + 10; 

      circle.setTranslateX(newX); 
      circle.setTranslateY(newY); 
     } 
    }); 


    BorderPane rootPane = new BorderPane(); 
    rootPane.setCenter(circle); 
    HBox hb = new HBox(btn1, btn2, btn3, btn4); 
    hb.setAlignment(Pos.CENTER); 
    rootPane.setBottom(hb); 




    Scene scene = new Scene(rootPane, 400, 400); 
    primaryStage.setTitle("Move the circle!"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
} 

私はそれを、ユーザーが望む位置に移動し、その古い位置から新しい位置に移動する方法に変更しますか?

ありがとうございます!

+3

リスナー内では、常に 'double newY = 0;'( 'x'と同じです)を実行します。サークルのx/y値をリスナーの外に保存する必要があります(例:あなたのクラスのメンバ変数の中で。 – pzaenger

答えて

1

translateXおよびは、いずれも円が描画される位置に影響する2つの独立したプロパティです。これらのプロパティのいずれかを調整する場合は、他のプロパティではなく同じプロパティの前の値を使用する必要があります。 (yプロパティについても同様。)

あなたはこのような何かにあなたのイベントハンドラのコードを変更する必要があり

// using only the translate properties 
double newY = circle.getTranslateY(); 
System.out.println("Went to the left."); 
double newX = circle.getTranslateX() - 10; 

circle.setTranslateX(newX); 
circle.setTranslateY(newY); 

または

// using only the center properties 
double newY = circle.getCenterY(); 
System.out.println("Went to the left."); 
double newX = circle.getCenterX() - 10; 

circle.setCenterX(newX); 
circle.setCenterY(newY); 

注:何かこれらのプロパティは変更されていないため、y座標に関連するコードはコード内では必要ありません。

+0

すごい説明!私のsetCenterと私のsetTranslateが問題を引き起こしているのを知らなかった。 –

関連する問題