我必须使用Timeline或Transition在无限循环中重新绘制画布吗



我有以下问题。

我是一个完全的JavaFX新手,我正在尝试编写一个"生命游戏"程序。

我有一节课;MainView;扩展VBox。MainView有一个ArrayList";playingField";的属性,由单元格组成,还有一个draw((方法,该方法根据单元格的状态在画布上绘制矩形。

在Field内部,我有一个transition((方法,它根据一些定义的转换规则来更改单元格的状态。

这很好,我可以通过点击初级阶段的按钮手动进行。不过,我想要的是,有可能按下一次按钮,然后有无限的进展步骤->transition((方法的应用程序和画布的重绘。

如果我尝试在循环中进行,它运行得很好,但当然也会快速识别单个步骤,但当我使用Thread.sleep((时,整个应用程序会冻结。

我知道我必须用时间线或转换来解决这个问题,但我在网上找不到足够的信息来说明如何在其中任何一个无限循环中对transition((和draw((方法进行线性化。

我希望下面的片段能让我自己更清楚:

public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {

MainView mainView = new MainView();

Scene scene = new Scene(mainView, 1000, 1032);
primaryStage.setScene(scene);
primaryStage.show();
mainView.draw();

} catch(Exception e) {
e.printStackTrace();
}
}

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

}

public MainView() extends VBox {
private Button stepButton;
private Canvas canvas;
private Field playingField;
this.stepButton = new Button("progress");
this.stepButton.setOnAction(ActionEvent -> {
playingField.fieldTransition();
draw();
});
public void draw() {
//drawing Rectangles that represent the cells of field on a canvas
}
}
}

带有transitions((方法的字段类:

public class Field implements TransitionRules {
public void fieldTransition(){
//method to change the state of the cells according to given rules.
}
}

谢谢大家,我成功了。

在mainView中,我定义了一个方法

public void progress() {
field.fieldTransition();
draw();
}

然后在Main我做了这个:

public class Main extends Application {
@Override
public void start(Stage primaryStage) {
try {

MainView mainView = new MainView();

Scene scene = new Scene(mainView, 1000, 1032);
primaryStage.setScene(scene);
primaryStage.show();
Timeline timeline = new Timeline();
KeyFrame frame1 = new KeyFrame(Duration.seconds(1.0), e -> mainView.progress());
timeline.getKeyFrames().add(frame1);
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
mainView.draw();

} catch(Exception e) {
e.printStackTrace();
}
}

我很确定我增加了一些不必要的弯路,我可能还需要做更多的工作,但这是我第一次自动取得进展。

还要感谢@James_D指出了另一个JavaFX线程。我不是自己发现的,但它看起来很有用,我将来会回来的。

我知道对你们中的一些人来说,制作这样的东西是非常基本的,但我几天前刚刚开始使用JavaFX,它的机制对我来说仍然有些困惑

最新更新