我试图通过绘制线制作排序算法,所以它看起来像一个图表。这里的问题是,当数组排序时,我无法将进度视为移动图。当我输入睡眠时间时,outprint只显示长行,并在睡眠线之后显示完整的排序图。所以我只需要在图表排序时看一些进展。在这种情况下,我正在使用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);
}
}
}
}
}
}
答案 0 :(得分:1)
通过覆盖JPanel(或JComponent)的paintComponent()
方法完成自定义绘制,然后将面板添加到框架中。阅读Custom Painting上的Swing教程中的部分,以获取一个工作示例。
如果要为绘画设置动画,则应使用Swing Timer来计划动画。搜索教程中的目录以查找How to Use Swing Timers
的部分以获取更多信息。
答案 1 :(得分:0)
通常,最好不要使用Thread.sleep或在paint方法中执行性能密集型的东西。这是因为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方法中删除此代码。