Java 试图在秋千工人内部绘制矩形

Java 试图在秋千工人内部绘制矩形,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,我有代码创建一组垂直矩形来可视化排序算法 class MyGUI extends JComponent { static int rectangleArray[][] = new int[50][2]; boolean populated = false; public void paint(Graphics g) { int margin = 5; if (!populated) { populate(); populated = true

我有代码创建一组垂直矩形来可视化排序算法

class MyGUI extends JComponent {
static int rectangleArray[][] = new int[50][2];
boolean populated = false;



public void paint(Graphics g) {
    int margin = 5;
    if (!populated) {
        populate();
        populated = true;
    }
    for (int i = 0; i < rectangleArray.length; i++) {
        if (rectangleArray[i][1] == 0) {
            g.setColor(Color.BLACK);
        } else if (rectangleArray[i][1] == 1) {
            g.setColor(Color.RED);
        } else if (rectangleArray[i][1] == 2) {
            g.setColor(Color.BLUE);
        }
        g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
        margin += 15;
        g.setColor(Color.BLACK);
    }
    insertionSort(); //i want to visually show the swaps here
}


public static void main(String[] a) {
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 800, 600);
    window.getContentPane().add(new MyGUI());
    window.setVisible(true);
}
}
MyGUI类扩展了JComponent{ 静态整数矩形数组[][]=新整数[50][2]; 布尔值=假; 公共空间涂料(图g){ 整数裕度=5; 如果(!已填充){ 填充(); 填充=真; } 对于(int i=0;i 我尝试在每次迭代后重新绘制画布。我知道我需要把它放进一个swing worker中,我的尝试是:

public class GUIv3 extends JPanel
{
static int rectangleArray[][] = new int[50][2];
boolean populated = false;

private class UpdateTextFieldThread extends SwingWorker<Void, Integer>
{
    static final int THREAD_DELAY = 50;

    protected Void doInBackground()
    {
        //this is the insertion sort code
        for (int i = 0; i < rectangleArray.length; i++) {  
            int value = rectangleArray[i][0];  
            int j = i - 1;  
            while (j >= 0 && rectangleArray[j][0] > value) {  
                rectangleArray[j + 1][0] = rectangleArray[j][0];  
                j = j - 1;  
            }  
            rectangleArray[j + 1][0] = value;  
            //printNumbers(rectangleArray);
            try {
                repaint();
                Thread.sleep(THREAD_DELAY);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        } 
        return null;
    }

}

public GUIv3()
{
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 800, 600);
    window.getContentPane().add(new GUIv3());
    window.setVisible(true);
    int margin = 5;
    if (!populated) {
        populate();
        populated = true;
    }
    for (int i = 0; i < rectangleArray.length; i++) {
        //i cant exactly do anything to g since it doesn't exist here...
        if (rectangleArray[i][1] == 0) {
            g.setColor(Color.BLACK);
        } else if (rectangleArray[i][1] == 1) {
            g.setColor(Color.RED);
        } else if (rectangleArray[i][1] == 2) {
            g.setColor(Color.BLUE);
        }
        g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
        margin += 15;
        g.setColor(Color.BLACK);
    }
}

public static void main(String[] args)
{
    new GUIv3();
}

    public void populate() {
    for (int i = 0; i < rectangleArray.length; i++) {
        rectangleArray[i][0] = (int)(Math.random() * 300) + 1;
    }
}
}
public类GUIv3扩展了JPanel
{
静态整数矩形数组[][]=新整数[50][2];
布尔值=假;
私有类UpdateTextFieldThread扩展SwingWorker
{
静态最终int线程延迟=50;
受保护的Void doInBackground()
{
//这是插入排序代码
对于(int i=0;i=0&&rectangleArray[j][0]>值){
矩形阵列[j+1][0]=矩形阵列[j][0];
j=j-1;
}  
矩形数组[j+1][0]=值;
//打印号码(矩形阵列);
试一试{
重新油漆();
休眠(线程延迟);
}捕获(中断异常例外){
Thread.currentThread().interrupt();
}
} 
返回null;
}
}
公共GUIv3()
{
JFrame窗口=新JFrame();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
窗.立根(30,30800600);
getContentPane().add(新GUIv3());
window.setVisible(true);
整数裕度=5;
如果(!已填充){
填充();
填充=真;
}
对于(int i=0;i
我已经评论了我的问题所在。我不知道如何在没有使用Graphics g的paint方法的情况下创建对象

谢谢

我尝试在每次迭代后重新绘制画布。我知道我需要把它放进一个swing worker中,我的尝试是:

public class GUIv3 extends JPanel
{
static int rectangleArray[][] = new int[50][2];
boolean populated = false;

private class UpdateTextFieldThread extends SwingWorker<Void, Integer>
{
    static final int THREAD_DELAY = 50;

    protected Void doInBackground()
    {
        //this is the insertion sort code
        for (int i = 0; i < rectangleArray.length; i++) {  
            int value = rectangleArray[i][0];  
            int j = i - 1;  
            while (j >= 0 && rectangleArray[j][0] > value) {  
                rectangleArray[j + 1][0] = rectangleArray[j][0];  
                j = j - 1;  
            }  
            rectangleArray[j + 1][0] = value;  
            //printNumbers(rectangleArray);
            try {
                repaint();
                Thread.sleep(THREAD_DELAY);
            } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        } 
        return null;
    }

}

public GUIv3()
{
    JFrame window = new JFrame();
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setBounds(30, 30, 800, 600);
    window.getContentPane().add(new GUIv3());
    window.setVisible(true);
    int margin = 5;
    if (!populated) {
        populate();
        populated = true;
    }
    for (int i = 0; i < rectangleArray.length; i++) {
        //i cant exactly do anything to g since it doesn't exist here...
        if (rectangleArray[i][1] == 0) {
            g.setColor(Color.BLACK);
        } else if (rectangleArray[i][1] == 1) {
            g.setColor(Color.RED);
        } else if (rectangleArray[i][1] == 2) {
            g.setColor(Color.BLUE);
        }
        g.fillRect (margin, 305 - rectangleArray[i][0], 10, rectangleArray[i][0]);
        margin += 15;
        g.setColor(Color.BLACK);
    }
}

public static void main(String[] args)
{
    new GUIv3();
}

    public void populate() {
    for (int i = 0; i < rectangleArray.length; i++) {
        rectangleArray[i][0] = (int)(Math.random() * 300) + 1;
    }
}
}
不,最简单的方法就是使用一个摆动计时器。由于您一步一步地迭代排序,因此实际的单个排序步骤几乎不需要任何处理时间,因此计时器应该为您提供足够的延迟,而不必处理创建SwingWorker或任何其他直接后台线程的麻烦

我不知道如何在没有使用Graphics g的paint方法的情况下创建对象

简单,只需将注意力集中在对集合(如数组或ArrayList)中的数字进行排序,然后在JPanel的
paintComponent(Graphics g)
方法中,迭代数组或集合,并根据集合中找到的数字绘制矩形,并使用JVM提供给
paintComponent
覆盖的图形对象。不过,别忘了先调用super的方法,以便删除上一个图形


编辑
你问:


如何在组件上实现摆动计时器?我可以得到一些关于如何启用swing定时器和执行这些覆盖的指导吗

一方不直接与另一方互动

  • 每次调用Swing Timer的ActionListener方法时,它将在排序迭代中执行一个新步骤
  • 然后,它将用新值填充类实例字段int-array或
    ArrayList
  • 然后在绘图矩形上调用
    repaint()
  • 调用
    repaint()
    将刺激绘制级联,通常会导致JVM调用绘图JPanel的
    paintComponent
    方法
  • 然后,此方法将使用数字遍历实例字段,并使用数字绘制矩形
  • 同样,paintComponent方法不直接与计时器交互,甚至不知道它的存在。它所知道要做的就是遍历集合并绘制集合的可视化表示
  • 并且计时器与paintComponent方法或图形对象没有直接交互。它所做的只是一个排序步骤,将数据填充到绘图代码可用的某个位置,然后通过调用
    repaint触发绘图(