我是java的新手,我被困在这里…我要做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动完成。有什么办法可以让我“告诉” JPanel痛楚吗?
我有进行排序(工作)的BubbleSort.java,有包含JPanel和JFrame类(用于显示未排序的直方图的工作)的Animation.java。
这是家庭作业,所以我不想在这里发布代码。但是,如果我的描述不起作用,我将其发布。
谢谢!
有没有一种方法可以“告诉” JPanel排序中发生的事情?
有很多方法可以做到这一点。最直接的方法是保留对当前未排序列表的引用,并在面板类中执行排序。每次从列表中交换2个元素时,调用repaint()以重新绘制列表中元素的当前位置。
repaint()
但是,更优雅的方法是通过在与执行排序的类之间建立契约来使用 Observer模式DrawingPanel。
DrawingPanel
的DrawingPanel,是否可以implements观察员接口,而SortAlgorightm类实现可观察到的接口。
SortAlgorightm
您可以在DrawingPanel每次交换2个元素时让通知sorting class。
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。
notifyObservers(observers);
bubbleSort()
即使您不是在JPanel上显示GUI,而是在其他contentPanes上显示GUI,也可以应用相同的逻辑。只需让类处理UI实施Observer并将其注册到即可SortingClass。
Observer
SortingClass
如果只有1个observer,您甚至不需要保留一个清单Observers。在我的示例中,您始终可以调整次要细节。
observer
Observers
如果不希望在交换2个元素时更新GUI,则始终可以将GUI移动notifyObservers();到要更新的其他位置。
notifyObservers();