JavaFX - 在运行时移动矩形?

时间:2018-04-12 17:25:56

标签: java javafx

我正在尝试在设置场景后移动一个矩形,但它似乎无法工作。

我从一个场景开始加载一个文件,该文件用于在按钮点击时创建下一个场景。

@Override
public void start(Stage primaryStage) {
    Scene scene = CreateStartScene();
    primaryStage.setScene(scene);

    // Load Click Event
    loadButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent e) {
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle("Select File");
            fileChooser.getExtensionFilters().addAll(new ExtensionFilter("Text Files", "*.txt"));

            File file = fileChooser.showOpenDialog(null);

            if (file != null) {
                fileTextField.setText(file.getAbsolutePath());
                startButton.setVisible(true);
            }
        }

    });

    // Start Click Event
    startButton.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent arg0) {
            if (!fileTextField.getText().isEmpty()) {
                // Read in maze file
                File file = new File(fileTextField.getText());
                ReadFile(file);

                Scene scene = CreateMainScene();
                primaryStage.setScene(scene);

                Solve();
            } else {
                errorLabel.setText("Please select a file");
            }
        }

    });

    primaryStage.show();
}

在CreateMainScene方法中,形状被添加到场景中,其中一个是这个矩形,它是一个实例变量

private Rectangle current;

这样添加:

current = new Rectangle();
current.setFill(Color.CORNFLOWERBLUE);

current.setWidth(10);
current.setHeight(10);

current.setX(j * 10);
current.setY(i * 10);
pane.getChildren().add(current);

一切正常,但是在solve方法(递归)中我试图改变那个矩形的位置,并暂停半秒钟。

    current.setX(x * 10);
    current.setY(y * 10);

    try {
        TimeUnit.MILLISECONDS.sleep(500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这不起作用。在最终更新之前,窗口会冻结几秒钟。我想显示矩形在移动,但我无法弄清楚如何去做。

1 个答案:

答案 0 :(得分:2)

您正在UI线程上执行所有操作。在等待UI线程时,您阻止它执行任何其他操作。有更清洁的解决方案,但这是为了证明潜在的问题:

// create and start new Thread, so we don't block the UI
new Thread(() -> {
    try {
        // wait some time on the new Thread
        TimeUnit.MILLISECONDS.sleep(500);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // give this to the UI system to be executed on the UI
    // thread as soon as there are resources 
    Platform.runLater(() -> {
        // do UI stuff
    });
}).start();