publicclassClassPanelextendsJPanelimplementsObserver{.....privateClassSoundsound=newClassSound(this);Threadprocesso;privatevoidexecutarProcesso(){if(processo==null){processo=newThread(sound);processo.start();}else{System.out.println("O processo ainda está em execução");}publicClassPanel(){.......b1.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){// TODO Auto-generated method stubexecutarProcesso();}});....}.....@Overridepublicvoidupdate(Observablearg0,Objectarg1){//processo = null;System.out.println("Acabou!!!!");}}
Eu não to conseguindo parar o processo quando o som para de tocar...
Tentei varias coisa mas até agora não conseguir.
Tb não sei se vou ter a necessidade de usar o padrão observer ou soh o thread mesmo ...
Ou se os dois são usados juntos....
Olha, se eu entendi bem, vc implementou o padrao Observer de forma que o método update seja chamado após o término do som. Acredito que o processo esteja parando sim, só que em nenhum momento vc chama o método do observador. Na sua classe Observable provavelmente deve ter um método como getObservers ou getObserverList, aí vc precisa pegar esses observadores, logo depois do clip.start() do seu método run da classe ClassSound e chamar o método update dessas interfaces, usando um for each, por exemplo. Tenta ai e depois fala se funcionou:
Ta acusando erro do metodo getObserverList() que não existe … e mesmo quando eu crio ele ainda assim
da um erro…
Tipo neste caso eu so vou adicionar um observers e deste jeito pelo que eu entendi
isto seria um ArrayList …acho que não precisaria ?
Obrigado.
renzonuccitelli
Bom, o padrao Observer preve que vc pode utilizar varios observadores, e como tinha o método addObserver, eu presumi que existisse um getObserver, ou getObserverList na sua classe Observable. Veja os método dessa classe e veja se tem algo do gênero na classe, ou caso realmente vc só esteja usando observador mesmo, deve ter um getObserver ou algo assim, aí basta vc chamar o update dele. Só coloquei o código pra vc ver que tem que chamar o método update. Em ultimo caso, vc poderia criar um atributo observer em sua classe e chamar o update do mesmo, passando a referencia para o atributo no construtor.
depois tentei outros metodos como hasChanged(), setChanged(), clearChanged() …
não consegui parar o processo e começar outro … pq na logica so começa outro processo se o processo for null.
....if(processo==null){processo=newThread(sound);processo.start();}else{System.out.println("O processo ainda está em execução");}
Então valeu pela ajuda vou continuar tentando aqui.
Se alguem tiver mais alguma sugestão eu agradeço.
Obrigado!
renzonuccitelli
Bom, tem que saber sobre essa classe clip tb. A forma que escrevi seria caso o método não execute uma Thread diferente. Caso clip.start() seja o inicio de outra Thread, a que vai rodar o clip, ai nao vai funcionar mesmo. Nessa caso, vc teria que sincronizar o método para esperar a Thread iniciada pelo clip acabar. Tb toma cuidado com esse processo=null, pq se vc estiver usando o mesmo como semaforo, vai ter que fazer isso sincronizadamente tb…
Filipe_A
Valeu Brigadão !
Parece ser um pouco complicado…
Vou procurar saber mais sobre a classe clip mas eu tenho quase certeza que ela executa uma thread tb…