Java 更新可观察到的

Java 更新可观察到的,java,arraylist,observable,observers,Java,Arraylist,Observable,Observers,我有一个听歌曲的小软件。我创建了一个小的图形界面,显示经过的时间、在标签中释放的时间,并创建了一个JSlider来了解歌曲中的大致位置。这部分代码还可以 我想,当我在JSlider上移动拇指时,更新歌曲的阅读位置。在这个目标中,我使用UpdateObservateur(Observateur=观察者)方法实现了一个接口“Observable”,该方法必须更新观察者列表 我的问题是:我可以访问updateObservator方法,但从不更新观察者。在下面的代码中,这意味着我可以显示“简单更新”,但

我有一个听歌曲的小软件。我创建了一个小的图形界面,显示经过的时间、在标签中释放的时间,并创建了一个JSlider来了解歌曲中的大致位置。这部分代码还可以

我想,当我在JSlider上移动拇指时,更新歌曲的阅读位置。在这个目标中,我使用UpdateObservateur(Observateur=观察者)方法实现了一个接口“Observable”,该方法必须更新观察者列表

我的问题是:我可以访问updateObservator方法,但从不更新观察者。在下面的代码中,这意味着我可以显示“简单更新”,但不能显示“完整更新”。我认为解决这个问题很容易,但是。。。我没有找到任何解决办法

import java.awt.BorderLayout;

import java.text.DecimalFormat;
import java.util.ArrayList;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class GUITimeDisplayer extends JPanel implements Observable {
private JLabel durationLabel = new JLabel();
private JLabel elapsedTimeLabel = new JLabel();
private JLabel remainedTimeLabel = new JLabel();
private ArrayList<Observateur> listObservateur = new ArrayList<Observateur>();
double position;
private double durationTime, remainingTime, elapsedSec, remainedSec;
private int elapsedMin, remainedMin;
DecimalFormat df = new DecimalFormat("00.00");
JSlider time = new JSlider();
boolean timeControl = true;


GUITimeDisplayer(double durationTime) {

    this.durationTime=durationTime;
    this.setLayout(new BorderLayout());
    JPanel timeDisplayer=new JPanel();
    timeDisplayer.setLayout(new BorderLayout());
    timeDisplayer.add(elapsedTimeLabel, BorderLayout.WEST);
    timeDisplayer.add(remainedTimeLabel, BorderLayout.EAST);
    time.setMinimum(0);
    time.setMaximum((int)durationTime);
    time.setPaintTicks(true);
    //time.setPaintLabels(true);
    time.setMinorTickSpacing(20);
    time.setMajorTickSpacing(60);
    if (timeControl == true ) {
        time.addChangeListener(new TestListener() {


        });
    }


    //this.add(durationLabel);
    this.add(timeDisplayer, BorderLayout.NORTH);
    //this.add(remainedTimeLabel);
    this.add(time, BorderLayout.CENTER);

}

class TestListener implements ChangeListener {

    @Override
    public void stateChanged(ChangeEvent event) {
        // TODO Auto-generated method stub
        position = (double)(((JSlider)event.getSource()).getValue());

        //System.out.println(position);
        updateObservateur();
    }

}

public void setDurationTime(double durationTime) {
    this.durationTime=durationTime;
    df.format(durationTime);
    durationLabel.setText(String.valueOf(df.format(durationTime)));
}

public void setElapsedTime(double elapsedTime) {
    if (elapsedTime >= 60) {
        elapsedMin=(int) elapsedTime/60;
        elapsedSec=elapsedTime%60;
        elapsedTimeLabel.setText(String.valueOf(elapsedMin)+":"+String.valueOf(df.format(elapsedSec)));
    } else {
        //elapsedSec=elapsedTime;
        elapsedTimeLabel.setText(String.valueOf(df.format(elapsedTime)));
    }
    remainingTime=durationTime-elapsedTime;
    if (remainingTime>=60) {
        remainedMin=(int) remainingTime/60;
        remainedSec=remainingTime%60;
        remainedTimeLabel.setText("-" + String.valueOf(remainedMin)+":"+String.valueOf(df.format(remainedSec)));
    } else {
        remainedTimeLabel.setText(String.valueOf(df.format(remainingTime)));
    }
    time.setValue((int)elapsedTime);

}


@Override
public void addObservateur(Observateur obs) {
    // TODO Auto-generated method stub
    this.listObservateur.add(obs);

}

@Override
public void delObservateur() {
    // TODO Auto-generated method stub
    this.listObservateur = new ArrayList<Observateur>();

}

@Override
public void updateObservateur() {
    // TODO Auto-generated method stub
    System.out.println("Simple update : "+position);
    for(Observateur obs : this.listObservateur) {
        obs.updatePosition(position);
        System.out.println("Complete update : "+position);
    }


}

}
导入java.awt.BorderLayout;
导入java.text.DecimalFormat;
导入java.util.ArrayList;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JSlider;
导入javax.swing.event.ChangeEvent;
导入javax.swing.event.ChangeListener;
公共类GUITimeDisplayer扩展了JPanel实现的Observable{
私有JLabel durationLabel=新JLabel();
私有JLabel elapsedtimelab=新JLabel();
私有JLabel remainedTimeLabel=新JLabel();
私有ArrayList ListObservator=新ArrayList();
双位;
专用双持续时间、剩余时间、延时秒、剩余秒;
私家车在elapsedMin,remainedMin;
DecimalFormat df=新的DecimalFormat(“00.00”);
JSlider time=新JSlider();
布尔时间控制=真;
GUITimeDisplayer(双持续时间){
this.durationTime=durationTime;
此.setLayout(新的BorderLayout());
JPanel timeDisplayer=新的JPanel();
setLayout(新的BorderLayout());
添加(elapsedTimeLabel,BorderLayout.WEST);
添加(remainedTimeLabel,BorderLayout.EAST);
时间。设置最小值(0);
time.setMaximum((int)durationTime);
time.setPaintTicks(true);
//time.setPaintLabels(true);
时间。设置最小间隔(20);
时间。设置主要时间间隔(60);
if(timeControl==true){
addChangeListener(新的TestListener(){
});
}
//添加(durationLabel);
添加(timeDisplayer,BorderLayout.NORTH);
//此.add(remainedTimeLabel);
添加(时间、边框布局、中心);
}
类TestListener实现ChangeListener{
@凌驾
公共无效状态已更改(ChangeEvent事件){
//TODO自动生成的方法存根
position=(double)((JSlider)event.getSource()).getValue());
//系统输出打印项次(位置);
updateObservateur();
}
}
public void setDurationTime(双durationTime){
this.durationTime=durationTime;
格式(持续时间);
durationLabel.setText(String.valueOf(df.format(durationTime));
}
公共无效设置elapsedTime(双elapsedTime){
如果(elapsedTime>=60){
elapsedMin=(int)elapsedMin/60;
elapsedSec=elapsedTime%60;
elapsedtimelab.setText(String.valueOf(elapsedMin)+“:”+String.valueOf(df.format(elapsedSec));
}否则{
//elapsedSec=elapsedTime;
elapsedtimelab.setText(String.valueOf(df.format(elapsedTime));
}
剩余时间=持续时间elapsedTime;
如果(剩余时间>=60){
remainadmin=(int)remainingTime/60;
剩余时间=剩余时间%60;
remainedTimeLabel.setText(“-”+String.valueOf(remainedMin)+:“+String.valueOf(df.format(remainedSec)));
}否则{
remainedTimeLabel.setText(String.valueOf(df.format(remainingTime));
}
time.setValue((int)elapsedTime);
}
@凌驾
公共无效附加观测员(观测员obs){
//TODO自动生成的方法存根
本表新增(obs);
}
@凌驾
公共真空去观测员(){
//TODO自动生成的方法存根
this.listObservator=新的ArrayList();
}
@凌驾
public void updateObservateur(){
//TODO自动生成的方法存根
System.out.println(“简单更新:+位置);
对于(Observator obs:this.listObservator){
obs.更新位置(位置);
System.out.println(“完整更新:+位置”);
}
}
}

看起来您并没有在任何地方调用addObservator()。你需要调用它。你必须:1)添加观察者,2)通知观察者,以及3)观察者必须做一些事情。如果你做不到这三件事,程序将无法运行。