2

我试图通过画线制作一个排序算法,所以它看起来像一个图表。这里的问题是,当数组排序时,我无法将进度视为移动图。当我输入睡眠时间时,输出只显示长线,在睡眠线之后显示完整的排序图。所以我只需要在图表排序时做一些事情来查看进度。在这种情况下,我使用的是 bublesort。我非常感谢您的每一次帮助!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

public class newClass extends JFrame {

public newClass() {
    final Thread hei = new Thread(new Runnable() {

        public void run() {
            bublesort();
        }
    });
    hei.start();
}
int[] array = { 400, 420, 380, 120, 340, 179, 454, 400, 420, 380, 120, 340, 179, 454, 400, 420, 380, 120, 340, 179 };

public void updateGraphic() {
    paint(this.getGraphics());
}

public void paint(Graphics g) {

    for (int i = 0; i < array.length; i++) {
        int tjue = 20;
        g.drawLine(i * tjue, 500, i * tjue, array[i]);
    }

    for (int j = 0; j < array.length - 1; j++) {
        for (int x = 0; x < array.length - 1; x++) {
            if (array[x] > array[x + 1]) {
                int temp = array[x];
                array[x] = array[x + 1];
                array[x + 1] = temp;
                updateGraphic();
                this.validate();
                try {
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                    Logger.getLogger(newClass.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }
}

}

4

2 回答 2

1

自定义绘制是通过覆盖paintComponent()JPanel(或 JComponent)的方法完成的,然后将面板添加到框架中。阅读自定义绘画的 Swing 教程中的部分以获取工作示例。

如果你想为这幅画设置动画,那么你应该使用 Swing Timer 来安排动画。从教程中搜索目录以查找有关How to Use Swing Timers详细信息的部分。

于 2013-04-10T00:02:53.677 回答
0

通常,最好不要使用 Thread.sleep 或在绘制方法中执行性能密集型工作。这是因为paint 方法在事件分派线程上执行,Swing 依赖该线程来执行 GUI 更新。相反,在单独的线程中运行您的排序,并在该线程中调用repaint()而不是调用updateGraphic()。看起来您已经有了一个bubbleSort()方法,所以只需像这样调整它:

for (int j = 0; j < array.length - 1; j++) {
    for (int x = 0; x < array.length - 1; x++) {
        if (array[x] > array[x + 1]) {
            int temp = array[x];
            array[x] = array[x + 1];
            array[x + 1] = temp;
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(newClass.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

当然,您需要从您的paint 方法中删除此代码。

于 2013-04-09T22:17:18.947 回答