2016-11-12 5 views
0

初めてJavaFXを使用するので、setLayout()/getLayout()メソッドの質問があります。私はバウンスボールプロジェクトを構築しています。最初にCircleオブジェクトを使用してボールを作成しましたが、より多くのパラメータを渡す必要があったので、独自のボールクラス(double x, double y, double dx, double dy, double size)を作成することにしました。これは私が私がCircleを使用したときに前に持っていたコードです:カスタムオブジェクトのJavaFXレイアウト

ball.setLayoutX(ball.getLayoutX() + dx); 
ball.setLayoutY(ball.getLayoutY() + dy); 

final Bounds bounds = canvas.getBoundsInLocal(); 
boolean right = ball.getLayoutX() >= (bounds.getMaxX() - ball.getRadius()); 
boolean left = ball.getLayoutX() <= (bounds.getMinX() + ball.getRadius()); 
boolean bottom = ball.getLayoutY() >= (bounds.getMaxY() - ball.getRadius()); 
boolean top = ball.getLayoutY() <= (bounds.getMinY() + ball.getRadius()); 

if (right || left) { 
    dx *= -1; 
} 
if (bottom || top) { 
    dy *= -1; 
} 

これはKeyFrameEventHandlerTimelineに入れたときに壁に跳ね返るCircle「ボール」を得ました。今私は方法getLayout()setLayout()getRadius()が私自身のオブジェクトを使用して解決することができないので、Ballボールでこれを動作させる方法を見つけようとしています。どうすればこの問題を回避できますか/自分のsetLayout()などを構築しますか?

答えて

0

ちょうどあなたのBallクラス内のすべてのそのロジックを置く:

public class Ball { 

    private final Circle view ; 

    private double dx ; 
    private double dy ; 

    public Ball(double size) { 
     view = new Circle(size); 
    } 

    public void move() { 

     Parent canvas = view.getParent(); 

     view.setLayoutX(view.getLayoutX() + dx); 
     view.setLayoutY(view.getLayoutY() + dy); 

     final Bounds bounds = canvas.getBoundsInLocal(); 
     boolean right = view.getLayoutX() >= (bounds.getMaxX() - view.getRadius()); 
     boolean left = view.getLayoutX() <= (bounds.getMinX() + view.getRadius()); 
     boolean bottom = view.getLayoutY() >= (bounds.getMaxY() - view.getRadius()); 
     boolean top = view.getLayoutY() <= (bounds.getMinY() + view.getRadius()); 

     if (right || left) { 
      dx *= -1; 
     } 
     if (bottom || top) { 
      dy *= -1; 
     } 
    } 

    public Node getView() { 
     return view ; 
    } 
} 

は今、あなたは、新しいボールを作成canvas.getChildren().add(ball.getView())を呼び出して、すべてのあなたのタイムラインが関係していることができますが、コールball.move()です。

public double getX() { 
    return view.getLayoutX(); 
} 

public void setX(double x) { 
    view.setLayoutX(x); 
} 

などが、最初のアプローチは、単純なようだ:

別のアプローチは、単にBallクラスから適切なメソッドを公開することです。

This demoは、同じアイデアを使用してやや複雑な実装です。

+0

私はこのアプローチを試みましたが、「キャンバス」をクリックするとボールが生成されることを忘れてしまい、クリックと同じくらい多くのボールがあります。ですから、 'List 'は 'MouseEventHandler'で作成したボールを追跡しています。私は 'GraphicsContext2D'を使ってキャンバスにボールを描画しています。 'List 'に変更して 'Node getView'を追加しようとすると、NullPointerExceptionが発生します。 – dot

関連する問題