我试图用Graphics2D和Swing来形象化排序算法(不知道这是不是一个好主意,我只是为了好玩而做)在一个小项目中,并且我将调用update方法,从而调用paintCompenent每次数组中的元素更改其值时的方法。
问题是paintComponent方法只在算法完成后才会被调用。这是算法的代码:
private void sortBubble() {
int n = array.length;
do {
int newn = 1;
for (int i = 0; i < n - 1; i++) {
if (array[i] > array[i + 1]) {
int index = array[i];
array[i] = array[i + 1];
array[i + 1] = index;
System.out.println("SWITCHED");
this.setChanged();
this.notifyObservers();
newn = i + 1;
}
}
n = newn;
} while (n > 1);
}
更新方法的代码:
public void update(Observable o, Object arg) {
if(draw!=null) {
drawPanel.remove(draw);
}
draw = new Plotter(array.array,this.getWidth(),this.getHeight());
drawPanel.add(draw);
drawPanel.validate();
System.out.println("UPDATED");
}
JPanel类的代码:
private void draw(Graphics g) {
g2d = (Graphics2D) g;
int i;
for(i=0;i<array.length;i++) {
g2d.draw(new Line2D.Double(i, height, i, height-array[i]));
}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
draw(g);
System.out.println("PLOTTED");
}
有没有办法让JPanel每次更改时实际更新?
答案 0 :(得分:1)
Swing是一个单线程框架,这意味着任何长时间运行/阻塞代码都会导致程序“停顿”,从而阻止它更新UI或响应用户输入。
有关详细信息,请参阅Concurrency in Swing。
有几种方法可以解决这个问题,您可以使用SwingWorker
或Swing Timer
,具体取决于您的需求/能力。
有关详细信息,请参阅Worker Threads and SwingWorker和How to use Swing Timers
另请参阅java multiple graphics以获取可视化排序实现的示例