Is there a way I can “tell” the JPanel what’s going on in the sorting?
有很多方法可以做到这一点.最直接的方法是保留对当前未排序列表的引用,并在面板类中执行排序.每次从列表中交换2个元素时,调用repaint()即可重新绘制列表中元素的当前位置.
但是,更优雅的方法是通过在DrawingPanel和执行排序的类之间建立协定来使用Observer模式.
DrawingPanel可以实现Observer接口,而SortAlgorightm类则实现Observable接口.
每次在排序类中交换2个元素时,您都可以通知DrawingPanel.
在观察者模式中,您将具有以下接口:
public interface Observer
{
public void update(ArrayList list);
}
public interface Observable
{
public void register(Observer o);
public void unregister(Observer o);
public void notifyObservers();
}
在GUI和排序算法之间建立契约:
class DrawingPanel extends JPanel implements Observer{
//Other attributes and initializations not shown
@Override
public void update(ArrayList list){
this.list = list; //You can choose to receive element
//indexs which got swapped instead (this is up to you)
repaint(); //Repaint your current display when list is updated
}
//Register myself with the sorting algorithm class
public void registerWith(Observable ob){
if(ob != null)
ob.register(this);
}
}
在您的SortingAlgorithm类中,启用它以将更新发送给已经向该类注册了自己的所有观察者:
class SortingAlgorithm implements Observable{
private ArrayList observers; //keep a list of observers for notifying
//Other attributes and initializations not shown
@Override
public void register(Observer o){
observers.add(o);
}
@Override
public void unregister(Observer o){
observers.remove(o);
}
@Override
public void notifyObservers(){
for(Observer o : observers)
o.update(list); //Update all observers with your latest list updates
}
public void bubbleSort(){
//Your sorting happens here..
for(int i=0; i < n; i++){
for(int j=1; j < (n-i); j++){
if(intArray[j-1] > intArray[j]){
//swap the elements!
temp = intArray[j-1];
intArray[j-1] = intArray[j];
intArray[j] = temp;
//Notify GUI to update screen
notifyObservers();
}
}
}
}
}
有了以上内容,GUI就会在您需要的任何时候进行更新.在这种情况下,由于我们放置了notifyObservers(observers);在bubbleSort()中,尤其是在交换元素时,因此,仅在列表更改时才更新GUI.
即使您不在JPanel上显示GUI,而是在其他contentPanes上显示GUI,也可以应用相同的逻辑.只需让类处理UI来实现Observer并将其注册到SortingClass.
如果您只有一个观察者,则甚至不需要保留一个观察者列表.在我的示例中,您始终可以调整次要细节.
如果不希望在交换2个元素时更新GUI,则可以始终移动notifyObservers();.到要更新的其他位置.