Re: Property updates
goddard at seznam.cz
goddard at seznam.cz
Mon Jun 11 03:48:42 PDT 2012
This is the output from the println statements:
centerXDoubleProperty [bean: Circle at 157a5c3, name: centerX, value: 396.34924225837125]
x: DoubleProperty [value: 396.34924225837125]
centerXDoubleProperty [bean: Circle at 157a5c3, name: centerX, value: 396.34924225837125]
x: DoubleProperty [value: 563.9584002793741]
centerXDoubleProperty [bean: Circle at 157a5c3, name: centerX, value: 396.34924225837125]
x: DoubleProperty [value: 337.0834495091644]
As you can see, the centerX value doesn't change at all. Any help is appreciated.
Regards, jiri
------------ Původní zpráva ------------
Od: <goddard at seznam.cz>
Předmět: Property updates
Datum: 10.6.2012 22:54:59
----------------------------------------
Hello,
the following code should create a Circle at random coords and animate the
translation to random coords. The point is to randomly translate the circle from
one location to another successively:
package boyle;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.animation.TimelineBuilder;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.CircleBuilder;
import javafx.stage.Stage;
import javafx.util.Duration;
/**
*
* @author jiri
*/
public class Boyle extends Application {
public static final int WIDTH = 800;
public static final int HEIGHT = 512;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
// end the animation at random coords
private DoubleProperty x = new SimpleDoubleProperty(Math.random() * WIDTH);
private DoubleProperty y = new SimpleDoubleProperty(Math.random() *
HEIGHT);
@Override public void start(Stage primaryStage) {
final Circle c = CircleBuilder.create()
// start the animation at random coords
.centerX(Math.random() * WIDTH)
.centerY(Math.random() * HEIGHT)
.radius(15).fill(Color.BLACK)
.build();
final DoubleProperty[] randCoords = {x, y};
final Timeline t = TimelineBuilder.create()
.keyFrames(new KeyFrame(Duration.seconds(5),
new KeyValue(c.centerXProperty(), randCoords[0].get()),
new KeyValue(c.centerYProperty(), randCoords[1].get())))
.build();
// refreshes coords at every end of the animation
t.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent ae) {
System.out.println("centerX"+ c.centerXProperty());
// set animation end coords to the target
c.centerXProperty().set(randCoords[0].get());
c.centerYProperty().set(randCoords[1].get());
System.out.println("x: "+ randCoords[0]);
// generate new coords for the animation end
randCoords[0].set(Math.random() * WIDTH);
randCoords[1].set(Math.random() * HEIGHT);
t.play();
}
});
t.play();
Group root = new Group();
root.getChildren().add(c);
Scene scene = new Scene(root, WIDTH, HEIGHT);
primaryStage.setTitle("@javafxcz - Boyle - www.dredwerkz.cz");
primaryStage.setScene(scene);
primaryStage.show();
}
}
However, the circle appears moving to its target coords instead to its end
coords, and update of the target coords doesn't work - unlike for the end
coords. Plus, there's a significant 1-2 seconds long pause before the animation
starts again in the handler, but just for the first time. Then it runs
smoothly.
Help in form of explanation / code sample is appreciated.
Regards, Jiri
More information about the openjfx-dev
mailing list