Java 将更改更新到另一个类

Java 将更改更新到另一个类,java,swing,Java,Swing,我是java新手,我被困在这里……我想做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动进行排序。我有没有办法“告诉”JPanel索林发生了什么事 我有BubbleSort.java进行排序(works),Animation.java包含JPanel和JFrame类(用于显示未排序的直方图) 这是家庭作业,所以我不想把我的代码贴在这里。但如果我的描述不起作用,我会发布它 谢谢大家! 更新:嗯,作业需要气泡排序,所以

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

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

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

谢谢大家!

更新:嗯,作业需要气泡排序,所以我必须。 这就是它应该是什么。我只有在最初几秒钟内未排序的黄色柱状图和一个有效的排序方法

我有没有办法“告诉”JPanel分拣过程中发生了什么

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


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

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

每次在
排序类中交换2个元素时,都可以通知
绘图面板


在您的观察者模式中,您将拥有以下界面:

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();
}
公共接口观察者
{
公共作废更新(ArrayList列表);
}
可观察的公共接口
{
公共无效登记册(观察员o);
公共作废注销(o);
公开的、无效的;
}
在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);
    }
}
class DrawingPanel扩展了JPanel{
//未显示其他属性和初始化
@凌驾
公共无效更新(ArrayList列表){
this.list=list;//您可以选择接收元素
//被替换的索引(这取决于您)
repaint();//更新列表时重新绘制当前显示
}
//向排序算法类注册我自己
带有(可观察ob)的公共无效登记器{
如果(ob!=null)
ob.登记簿(本);
}
}
在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();
                }    
            }
        }
    } 
}
类排序算法实现可观察{
private ArrayList Observators;//保留观察者列表以进行通知
//未显示其他属性和初始化
@凌驾
公开作废登记册(o){
观察员:添加(o);
}
@凌驾
公共作废注销(o){
观察员:删除(o);
}
@凌驾
公营机构({
观察员(o:观察员)
o、 更新(列表);//用最新列表更新所有观察者
}
public void bubbleSort(){
//你的分类在这里进行。。
对于(int i=0;iintArray[j]){
//交换元素!
温度=内阵列[j-1];
intArray[j-1]=intArray[j];
intArray[j]=温度;
//通知GUI更新屏幕
通知观察员();
}    
}
}
} 
}
有了上述功能,GUI将在您需要时随时更新。在这种情况下,因为我们放置了
notifyobservators(observators)
bubbleSort()
中,尤其是在交换元素时,因此GUI仅在列表更改时更新

即使您不是在JPanel而是在其他ContentPane上显示GUI,也可以应用相同的逻辑。只需让类处理UI实现
观察者
,并将其注册到
排序类

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


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

我有没有办法“告诉”JPanel分拣过程中发生了什么

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


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

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

每次在
排序类中交换2个元素时,都可以通知
绘图面板


在您的观察者模式中,您将拥有以下界面:

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();
}
公共接口观察者
{
公共作废更新(ArrayList列表);
}
可观察的公共接口
{
公共无效登记册(观察员o);
公共作废注销(o);
公开的、无效的;
}
在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);
    }
}
class DrawingPanel扩展了JPanel i