有没有一种方法可以“告诉” JPanel排序中发生的事情?
有很多方法可以做到这一点。最直接的方法是保留对当前未排序列表的引用,并在面板类中执行排序。每次从列表中交换2个元素时,调用
repaint()以重新绘制列表中元素的当前位置。
但是,更优雅的方法是通过在与执行排序的类之间建立契约来使用 Observer模式
DrawingPanel。
的
DrawingPanel,是否可以implements观察员接口,而
SortAlgorightm类实现可观察到的接口。
您可以在
DrawingPanel每次交换2个元素时让通知
sorting class。
在 Observer Pattern中 ,您将具有以下接口:
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上显示GUI,而是在其他contentPanes上显示GUI,也可以应用相同的逻辑。只需让类处理UI实施
Observer并将其注册到即可
SortingClass。
如果只有1个
observer,您甚至不需要保留一个清单
Observers。在我的示例中,您始终可以调整次要细节。
如果不希望在交换2个元素时更新GUI,则始终可以将GUI移动notifyObservers();
到要更新的其他位置。



