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 を使用したり、ペイント メソッドでパフォーマンスを集中的に使用したりしないことをお勧めします。これは、ペイント メソッドがイベント ディスパッチ スレッドで実行され、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);
            }
        }
    }
}

もちろん、ペイント メソッドからこのコードを削除する必要があります。

于 2013-04-09T22:17:18.947 に答える