我试图显示在屏幕上生成迷宫的过程,但在该过程完成之前屏幕永远不会更新。我正在使用消费者来通知 JavaFX 端。我试过用Platform.runLater()没用。
以下是正在使用的文件:
“你好-view.fxml”
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.StackPane?>
<StackPane onMouseClicked="#randomize" fx:id="sp" xmlns:fx="http://javafx.com/fxml" fx:controller="com.example.demo2.HelloController">
</StackPane>
这是迷宫生成器“BasicMaze.java”的截断版本:
package com.example.demo2;
import java.util.*;
import java.util.function.Consumer;
public class BasicMaze {
public int width;
public int height;
private transient List<Consumer<BasicMaze>> consumers = new ArrayList<>();
public void reset(int w, int h) {
width = w;
height = h;
alertConsumers();
}
public void addConsumer(Consumer<BasicMaze> l) {
if (consumers == null) consumers = new ArrayList<>();
consumers.add(l);
}
public void alertConsumers() {
consumers.forEach(c -> c.accept(this));
}
public void generate() {
int slots = width * height;
do {
if (Math.random() * 10 < 1) {
alertConsumers(); //Platform.runLater tried here
slots--;
}
} while (slots > 1);
System.out.println("DONE!");
}
}
这是控制器,“HelloController.java”:
package com.example.demo2;
import javafx.fxml.FXML;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
public class HelloController {
@FXML
StackPane sp;
final Canvas canvas = new Canvas(250,250);
BasicMaze maze = new BasicMaze();
@FXML
public void initialize() {
sp.getChildren().add(canvas);
maze.addConsumer(basicMaze -> this.draw()); //platform.runLater tried here.
}
public void randomize() {
maze.reset(5, 5);
maze.generate();
}
public void draw() {
GraphicsContext gc = canvas.getGraphicsContext2D() ;
gc.setLineWidth(1.0);
gc.setFill(Color.BLACK);
for (int j = 0; j < maze.height; j++) {
for (int i = 0; i < maze.width; i++) {
gc.moveTo(Math.random()*250, Math.random()*250);
gc.lineTo(Math.random()*250, Math.random()*250);
gc.stroke();
}
}
}
}
这是主要功能存根:
package com.example.demo2;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
如果你运行它并点击屏幕,“完成!” 会出现在控制台上,会有延迟,然后屏幕会出现一堆黑线。我正在尝试在绘制每条线时更新屏幕。