Java 窗格输出未更新

Java 窗格输出未更新,java,javafx,histogram,pane,Java,Javafx,Histogram,Pane,我有代码对一个由20个整数组成的数组进行冒泡排序,并将显示输出为一个条形图,该条形图随着其排序而变化。我的问题是图表永远不会改变。我使用一个println来验证代码是否到达了它应该输出条的位置,但是在我的窗格中没有任何更改。我尝试使用super.getChildren().removeAll();和super.getChildren().clear();在条形图输出运行之前,但仍无法清除窗格 package mp3; import javafx.application.Application;

我有代码对一个由20个整数组成的数组进行冒泡排序,并将显示输出为一个条形图,该条形图随着其排序而变化。我的问题是图表永远不会改变。我使用一个println来验证代码是否到达了它应该输出条的位置,但是在我的窗格中没有任何更改。我尝试使用super.getChildren().removeAll();和super.getChildren().clear();在条形图输出运行之前,但仍无法清除窗格

package mp3;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author Angel
 */
public class MP3 
extends Application 
{

    @Override
    public void start(Stage primaryStage) 
    throws Exception{
        Button bubble = new Button();
        bubble.setText("Bubble Sort");

        HBox hb = new HBox();
        StackPane root = new StackPane();
        hb.getChildren().add(bubble);

        Histogram bars = new Histogram(); 
        root.getChildren().addAll( bars, hb);
        bars.setArray();
        BubbleSort bs = new BubbleSort(bars);
        Thread thread1 = new Thread (bs);

        bubble.setOnAction((ActionEvent event) -> 
        {
            thread1.start();
        });

        Scene scene = new Scene(root, 600, 250);

        primaryStage.setTitle("Histogram");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}


package mp3;


import java.util.Random;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

/** @author Angel */

public class Histogram 
extends Pane
{
    int[] numbers;
    int[] coloredIndexes;

    public void setNumbers (int[] nums)
    {
        numbers = nums;
        //System.out.println("call to set numbers");
        paintHistogram();
    }
    public void setNumbers (int[] nums, int[] indexes)
    {
        numbers = nums;
        coloredIndexes = indexes;
        paintHistogram();
    }
    public int[] getArray()
    {
        return numbers;
    }
    public void setArray()
    {
        int[] ar = new int[20];
        int[] ind = new int[20];
        for(int i = 0; i < 20; i++)
        {
            ar[i] = i;
        }

        Random rnd = new Random();
        for (int i = ar.length - 1; i > 0; i--)
        {
            int index = rnd.nextInt(i + 1);
            // Simple swap
            int a = ar[index];
            ar[index] = ar[i];
            ar[i] = a;
        }
        setNumbers(ar);
        paintHistogram();
    }

    public void paintHistogram()
    {

        System.out.println("in painting");
        int maxNumberOfArray = numbers[0];
        //max number in array
        for (int i = 0; i < numbers.length; ++i)
        {
            if (numbers[i] > maxNumberOfArray)
                maxNumberOfArray = numbers[i];
        }
        for (int i = 0; i < numbers.length; ++i)
        {
            int heightRectangle = numbers[i] * 5; 
            int widthRectangle = 5;
            int pos = 200-heightRectangle;
            Rectangle x = new Rectangle(i*10, pos, widthRectangle, heightRectangle);
            x.setStroke(Color.BLACK);
            x.setFill(Color.MAGENTA);
            super.getChildren().add(x);
        }
    }
}


package mp3;

import javafx.application.Platform;
import javafx.scene.layout.StackPane;

/** @author Angel */

public class BubbleSort 
extends Histogram
implements Runnable
{
    int[] sorting;
    Histogram sort;


    public BubbleSort(Histogram bars)
    {
        sorting = bars.getArray().clone();
        sort = bars;
    }


    @Override
    public void run() 
    {

        Platform.runLater(()->
        {
        int temp;
        //System.out.println("called run");
        for(int j = 0; j < sorting.length; ++j)
        {
        for(int i = 1; i < sorting.length; ++i)
        {
            //System.out.println("in sort loop");
            if(sorting[i - 1] > sorting[i])
            {
                    temp = sorting[i - 1];
                    sorting[i - 1] = sorting[i];
                    sorting[i] = temp;
                    //System.out.println("i: " + sorting[i] + "  i - 1: " + sorting[i - 1]);

                    setNumbers(sorting);

            try
            {
                Thread.sleep(50);
            }
             catch( InterruptedException e )
            {
                //JOptionPane.showMessageDialog(null, e.getMessage());
            } 
            }
        }
        }
        for(int k = 0; k < sorting.length; ++k)
        {
            System.out.print(sorting[k] + ", ");
        }
        });
    }
}
打包mp3;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
/**
*
*@作者天使
*/
公共级MP3
扩展应用程序
{
@凌驾
公共无效开始(阶段primaryStage)
抛出异常{
按钮气泡=新按钮();
bubble.setText(“bubble排序”);
HBox hb=新的HBox();
StackPane root=新的StackPane();
hb.getChildren().add(气泡);
直方图条=新直方图();
root.getChildren().addAll(条,hb);
bar.setArray();
BubbleSort bs=新的BubbleSort(条形);
螺纹1=新螺纹(bs);
bubble.setOnAction((ActionEvent事件)->
{
thread1.start();
});
场景=新场景(root,600250);
初级阶段。设置标题(“直方图”);
初级阶段。场景(场景);
primaryStage.show();
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
发射(args);
}
}
包装mp3;
导入java.util.Random;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.StackPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
/**@作者天使*/
公共类直方图
扩展窗格
{
int[]数字;
int[]彩色索引;
公共无效集合编号(int[]nums)
{
数字=nums;
//System.out.println(“调用设置号码”);
彩色直方图();
}
公共void集合号(int[]nums,int[]index)
{
数字=nums;
彩色索引=索引;
彩色直方图();
}
public int[]getArray()
{
返回号码;
}
公共void setArray()
{
int[]ar=新的int[20];
int[]ind=新的int[20];
对于(int i=0;i<20;i++)
{
ar[i]=i;
}
随机rnd=新随机();
对于(int i=ar.length-1;i>0;i--)
{
整数指数=rnd.nextInt(i+1);
//简单交换
int a=ar[指数];
ar[index]=ar[i];
ar[i]=a;
}
设定值(ar);
彩色直方图();
}
公共图书馆(
{
System.out.println(“绘画中”);
int maxNumberOfArray=数字[0];
//数组中的最大数
对于(int i=0;imaxNumberOfArray)
maxNumberOfArray=数字[i];
}
对于(int i=0;i
{
内部温度;
//System.out.println(“称为run”);
对于(int j=0;j排序[i])
{
temp=排序[i-1];
排序[i-1]=排序[i];
排序[i]=温度;
//System.out.println(“i:+排序[i]+”i-1:+排序[i-1]);
设置编号(排序);
尝试
{
睡眠(50);
}
捕捉(中断异常e)
{
//showMessageDialog(null,e.getMessage());
} 
}
}
}
对于(int k=0;k
我还尝试删除我的按钮,让线程单独运行,场景中只有窗格,但运行时窗格为空,最后仅显示未排序的“图表”,您正在FX应用程序线程上运行整个排序,因此,在整个工作完成之前,FX应用程序线程将没有机会更新UI。在后台线程上运行排序,特别是50ms暂停,然后在FX应用程序线程上安排对UI的更改。