我是java的新手,我被困在这里......我想要做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动完成。有没有办法可以“告诉”JPanel在袜子里发生了什么?
我有BubbleSort.java进行排序(工作),Animation.java包含JPanel和JFrame类(用于显示未排序的直方图)。
这是作业,所以我不想在这里发布我的代码。但如果我的描述不起作用,我会发布它。
谢谢!
更新:家庭作业需要冒泡排序,所以我必须这样做。 https://www.youtube.com/watch?v=wB7ovstyH4E 这就是它的假设。我在前几秒内只有未分类的黄色直方图和一种有效的分类方法。
答案 0 :(得分:4)
我有没有办法告诉" JPanel在排序中发生了什么?
有很多方法可以做到这一点。最直接的方法是保留当前未排序列表的引用并在面板类中执行排序。每次从列表中交换2个元素时,调用repaint()
重新绘制列表中元素的当前位置。
然而,通过在DrawingPanel
和执行排序的类之间建立合约,更优雅的方式是使用 观察者模式 。
DrawingPanel
可以实现Observer接口,而SortAlgorightm
类可以实现Observable接口。
您可以在DrawingPanel
每次更换2个元素时通知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上显示GUI,也没有在其他contentPanes上显示GUI,可以应用相同的逻辑。只需让类处理UI来实现Observer
并将其注册到SortingClass
。
如果您只有1 observer
,则甚至不需要保留Observers
列表。您可以随时调整我的示例中的次要细节。
如果您不想在交换2个元素时更新GUI,您可以随时将notifyObservers();
移动到您想要更新的其他位置。