有没有一种方法可以“告诉”JPanel 排序过程中发生了什么?
有很多方法可以做到这一点。最直接的方法是保留当前未排序列表的引用并在面板类中执行排序。每次从列表中交换 2 个元素时,调用 repaint() 重新绘制列表中元素的当前位置。
然而,更优雅的方式是使用观察者模式,方法是在DrawingPanel 和执行排序的类之间建立契约。
DrawingPanel 可以实现 Observer 接口,而 SortAlgorightm 类实现 Observable 接口。
您可以让DrawingPanel 每次在sorting class 中交换两个元素时得到通知。
在您的观察者模式中,您将拥有以下接口:
public interface Observer
{
public void update(ArrayList<Integer> 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<Integer> 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<Observer> 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 上而是在其他 contentPanes 上显示您的 GUI,也可以应用相同的逻辑。只需让类处理UI实现Observer并将其注册到SortingClass即可。
如果您只有 1 个observer,您甚至不需要保留Observers 的列表。您可以随时调整我示例中的小细节。
如果您不希望在交换 2 个元素时更新 GUI,您可以随时将 notifyObservers(); 移动到另一个您想要更新的位置。