Change Listeners

3 respostas
rafaelveggi

Olá, GUJ!

Minha dúvida é a seguinte:
tenho uma classe singleton chamada Playlist. Esta classe representa uma lista de músicas que é exibida na tela através de outra classe: GUIPlaylist.
Preciso de uma forma de “automatizar” os updates (leia validate()) da classe de GUI para qualquer alteração no meu objeto Playlist.
Toda vez que algo acontecer à playlist, fazer um update na tela GUIPlaylist.
Isso é possível? Tem um nome pra isso? Alguém me pode ajudar?

Obrigado.

3 Respostas

D

Eventos e escutadores de eventos… acho que é isso
da mesma maneira que um botão “avisa” ao seu listener quando é clicado, tu pode fazer com que a tua playlist “avise” a GUI que foi modificada…
já pensou em algo do tipo?

rafaelveggi

Obrigado pela dica, dark_creator
Andei pesquisando nos tutoriais da sun e encontrei o tal do PropertyChangeListener. Estou no seguinte ponto:
Minha classe de playlist é ± esta:

public class Playlist {
	private ArrayList<Title> items = new ArrayList<Title>(10);
	private static Playlist instance;
	private final PropertyChangeSupport pcs = new PropertyChangeSupport(this);

	private Playlist() {}

	public static Playlist getInstance() {
		if(instance == null) {
			instance = new Playlist();
		}
		return instance;
	}

	public boolean addItem(Title item) {
		ArrayList<Title> old = items;
		if(items.size() < Constants.MAX_PLAYLIST_ITEM_NUMBER) {
			items.add(item);
			this.pcs.firePropertyChange("items", old, items);
			return true;
		} else {
			return false;
		}
	}

	public void removeItem(int index) {
		ArrayList<Title> old = items;
		items.remove(index);
		this.pcs.fireIndexedPropertyChange("items", index, old, items);
	}

	public void addPropertyChangeListener(PropertyChangeListener listener) {
		this.pcs.addPropertyChangeListener(listener);
	}

	public void removePropertyChangeListener(PropertyChangeListener listener) {
		this.pcs.removePropertyChangeListener(listener);
	}
}

O esboço da classe que “escuta” a playlist (o trocadilho não foi intencional) é:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class GUIPlaylist extends JPanel {
	private Playlist playlist = Playlist.getInstance();

	public GUIPlaylist() {
		playlist.addPropertyChangeListener(new PlaylistChangeListener());
		...
		GUI
		...
	}

	private void toUp() {
		grid.toUp();
	}

	private void toDown() {
		grid.toDown();
	}

	private void removeItem() {
		grid.removeItem();
	}
	
	.
	.
	.
	
	private class PlaylistChangeListener implements PropertyChangeListener {
		public void propertyChange(PropertyChangeEvent evt) {
			if(evt.getPropertyName().equals("items")) {
				reagir();
			}
		}
	}
}

Não postei as classes como estão no original pq estão muito grandes.
Estou fazendo algo de errado? me esquecendo de alguma coisa?
Obrigado, GUJ

rafaelveggi

Parece que o ChangeListener me serve, pois eu não preciso reagir a cada mudança em específico.
O problema é que eu não consigo criar o método addChangeListener() na classe Playlist.

Alguém teria alguma dica de como fazer isso?
Ou é melhor continuar utilizando o PropertyChangeListener?

Obrigado

Criado 15 de março de 2008
Ultima resposta 16 de mar. de 2008
Respostas 3
Participantes 2