Java 将更改更新到另一个类
我是java新手,我被困在这里……我想做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动进行排序。我有没有办法“告诉”JPanel索林发生了什么事 我有BubbleSort.java进行排序(works),Animation.java包含JPanel和JFrame类(用于显示未排序的直方图) 这是家庭作业,所以我不想把我的代码贴在这里。但如果我的描述不起作用,我会发布它 谢谢大家! 更新:嗯,作业需要气泡排序,所以我必须。 这就是它应该是什么。我只有在最初几秒钟内未排序的黄色柱状图和一个有效的排序方法 我有没有办法“告诉”JPanel分拣过程中发生了什么 有很多方法可以做到这一点。最直接的方法是保留当前未排序列表的引用,并在panel类中执行排序。每次从列表中交换两个元素时,调用Java 将更改更新到另一个类,java,swing,Java,Swing,我是java新手,我被困在这里……我想做的是将一个java文件中arraylist的更改更新为另一个文件中的JPanel。我正在对arraylist进行排序,因此无法手动进行排序。我有没有办法“告诉”JPanel索林发生了什么事 我有BubbleSort.java进行排序(works),Animation.java包含JPanel和JFrame类(用于显示未排序的直方图) 这是家庭作业,所以我不想把我的代码贴在这里。但如果我的描述不起作用,我会发布它 谢谢大家! 更新:嗯,作业需要气泡排序,所以
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