如何从按钮动作内部刷新JavaFX场景?
我正在制作一个排序算法可视化工具,我希望UI能够实时更新,一步一步地显示它是如何工作的 但是UI只在sort()方法完成时更新,我希望它在updateHeight()完成时更新 sort()方法由onAction启动如何从按钮动作内部刷新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;
@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=计数器;
}