小编典典

更新更改到另一个类

java

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

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

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

谢谢!


阅读 268

收藏
2020-11-26

共1个答案

小编典典

有没有一种方法可以“告诉” 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();到要更新的其他位置。

2020-11-26