更新到另一个类的更改

我是java的新手,我被困在这里……我想要做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。 我正在对arraylist进行排序,因此无法手动完成。 有没有办法可以“告诉”JPanel在袜子里发生了什么?

我有BubbleSort.java进行排序(工作),Animation.java包含JPanel和JFrame类(用于显示未排序的直方图)。

这是家庭作业所以我不想在这里发布我的代码。 但如果我的描述不起作用,我会发布它。

谢谢!

更新:家庭作业需要冒泡,所以我必须这样做。 https://www.youtube.com/watch?v=wB7ovstyH4E以下是它的假设。 我在前几秒内只有未分类的黄色直方图和一个工作排序方法。

有没有办法可以“告诉”JPanel在排序中发生了什么?

有很多方法可以做到这一点。 最直接的方法是保留当前未排序列表的引用并在面板类中执行排序。 每次从列表中交换2个元素时,调用repaint()重新绘制列表中元素的当前位置。


但是,更优雅的方法是通过在DrawingPanel和执行排序的类之间建立契约来使用Observer模式

DrawingPanel可以实现Observer接口,而SortAlgorightm类可以实现Observable接口。

每次在sorting class中交换2个元素时,您都可以通知DrawingPanel


Observer模式中 ,您将拥有以下接口:

 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 < (ni); 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

如果你只有一个observer ,你甚至不需要保留一个Observers列表。 您可以随时调整我的示例中的次要细节。


如果您不想在交换2个元素时更新GUI,您可以随时移动notifyObservers(); 到您想要更新的另一个位置。