更新到另一个类的更改

时间:2016-03-08 20:04:07

标签: java swing

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

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

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

谢谢!

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

1 个答案:

答案 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();移动到您想要更新的其他位置。