如何从按钮动作内部刷新JavaFX场景?

如何从按钮动作内部刷新JavaFX场景?,java,javafx,Java,Javafx,我正在制作一个排序算法可视化工具,我希望UI能够实时更新,一步一步地显示它是如何工作的 但是UI只在sort()方法完成时更新,我希望它在updateHeight()完成时更新 sort()方法由onAction启动 @FXML public void sort() throws InterruptedException { minHeight = RectHeight[0]; counter = 0; minIndex = 0; temp = 0;

我正在制作一个排序算法可视化工具,我希望UI能够实时更新,一步一步地显示它是如何工作的

但是UI只在sort()方法完成时更新,我希望它在updateHeight()完成时更新

sort()方法由onAction启动

   @FXML
public void sort() throws InterruptedException {
    minHeight = RectHeight[0];
    counter = 0;
    minIndex = 0;
    temp = 0;

    for(int i=1;i<RectList.size();i++){
        System.out.println(RectList.size());
        System.out.println(counter);
        sort2();
    }


}
public void sort2() throws InterruptedException {
    System.out.println("start sort");

    System.out.println(minHeight);



    System.out.println("find min");
    for (int i = counter; i < (RectList.size()); i++) {
        System.out.println("i= " + i);
        if (RectHeight[i] < minHeight) {
            minHeight = RectHeight[i];
            System.out.println("minHeight= " + minHeight);
            System.out.println("minIndex= " + i);
            minIndex = i;
        }
    }

    updateHeight();
    Thread.sleep(500);

}

public void updateHeight() {
    temp = RectHeight[counter];
    RectHeight[counter] = RectHeight[minIndex];
    RectList.get(counter).setHeight(RectHeight[counter]);

    RectHeight[minIndex] = temp;
    RectList.get(minIndex).setHeight(temp);


    counter++;
    minHeight = RectHeight[counter];
    minIndex = counter;

}
@FXML
public void sort()引发InterruptedException{
最小高度=矩形高度[0];
计数器=0;
minIndex=0;
温度=0;

对于(int i=1;i决不在FX应用程序线程上休眠。该线程负责呈现UI,因此,如您所观察到的,通过使用
thread.sleep()
阻塞它,可以防止呈现UI

相反,请使用。一个简单的
时间线
应该在这里起作用:

@FXML
public void sort() {

    Timeline timeline = new Timeline();
    timeline.getKeyFrames().add(new KeyFrame(Duration.millis(500), e -> sort2()));
    timeline.setCycleCount(rectList.size());
    minHeight = rectHeight[0];
    counter = 0;
    minIndex = 0;
    temp = 0;

    timeline.play();


}

public void sort2() {
    System.out.println("start sort");

    System.out.println(minHeight);



    System.out.println("find min");
    for (int i = counter; i < (rectList.size()); i++) {
        System.out.println("i= " + i);
        if (rectHeight[i] < minHeight) {
            minHeight = rectHeight[i];
            System.out.println("minHeight= " + minHeight);
            System.out.println("minIndex= " + i);
            minIndex = i;
        }
    }

    updateHeight();

}

public void updateHeight() {
    temp = rectHeight[counter];
    rectHeight[counter] = rectHeight[minIndex];
    rectList.get(counter).setHeight(rectHeight[counter]);

    rectHeight[minIndex] = temp;
    rectList.get(minIndex).setHeight(temp);


    counter++;
    minHeight = rectHeight[counter];
    minIndex = counter;

}
@FXML
公共无效排序(){
时间线=新时间线();
timeline.getKeyFrames().add(新的关键帧(Duration.millis(500),e->sort2());
timeline.setCycleCount(rectList.size());
最小高度=矩形高度[0];
计数器=0;
minIndex=0;
温度=0;
timeline.play();
}
公共无效排序2(){
System.out.println(“开始排序”);
系统输出打印LN(最小高度);
System.out.println(“find min”);
对于(int i=计数器;i<(rectList.size());i++){
System.out.println(“i=“+i”);
if(矩形高度[i]<最小高度){
最小高度=矩形高度[i];
System.out.println(“minHeight=“+minHeight”);
System.out.println(“minIndex=“+i”);
minIndex=i;
}
}
updateHeight();
}
公共void updateHeight(){
温度=高度[计数器];
rectHeight[计数器]=rectHeight[最小索引];
rectList.get(counter).setHeight(recthheight[counter]);
rectHeight[minIndex]=温度;
rectList.get(minIndex).setHeight(temp);
计数器++;
最小高度=矩形高度[计数器];
minIndex=计数器;
}