Omet navegació

2.3.2.3 CF-Java: Tot l'exemple

Anem a posar tot l'exemple del xat complet, això sí, amb algunes modificacions i millores:

  • Tindrem la classe Missatge amb les propietat nom i contingut (expressament diferents dels noms utilitzats en l'exemple anterior per poder comprovar que aquestes modificacions funcionen i milloren l'exemple). Posarem també la data (com un long) per a poder ordenar els missatges cronològicament
  • Llevem les coses que no s'utilitzen estrictament en aquest exemple
  • No definirem la referència a la Base de Dades en cada utilització. Únicament una vegada al principi, després de la connexió.
  • Posem un JComboBox per a poder triar entre més d'un xat. Per a no modificar les coses ja fetes, posarem la creació dels listeners en un mètode anomenat inicialitzar(), ja que ara els listeners dependran del xat triat. I haurem d'anar amb compte també de parar els listeners, ja creats. És a dir, si primer triem un xat, tindrem els listeners que apunten a ell. Si després triem un altre xat i creem els listeners una altra vegada per a que apunten al lloc correcte, els tindrem per duplicat. Hauríem de parar els primers listeners

Aquest és la classe Missatge

public class Missatge{
    public String nom;
    public long data;
    public String contingut;

    public Missatge(){
    }

    public Missatge(String nom,String cont){
        this.nom=nom;
        this.contingut=cont;
    }

	public Missatge(String nom, long data, String contingut) {
		super();
		this.nom = nom;
		this.data = data;
		this.contingut = contingut;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}


	public long getData() {
		return data;
	}

	public void setData(long data) {
		this.data = data;
	}
	
	public String getContingut() {
		return contingut;
	}

	public void setContingut(String contingut) {
		this.contingut = contingut;
	}
    
}

Aquest és el programa

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import com.google.api.core.ApiFuture;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.firestore.DocumentChange;
import com.google.cloud.firestore.DocumentReference;
import com.google.cloud.firestore.DocumentSnapshot;
import com.google.cloud.firestore.EventListener;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.FirestoreException;
import com.google.cloud.firestore.ListenerRegistration;
import com.google.cloud.firestore.QueryDocumentSnapshot;
import com.google.cloud.firestore.QuerySnapshot;
import com.google.firebase.FirebaseApp;
import com.google.firebase.FirebaseOptions;
import com.google.firebase.cloud.FirestoreClient;
import com.google.firebase.database.annotations.Nullable;

public class Pantalla_CrearXatCloud extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	JLabel etComboXats = new JLabel("Llista de tots els xats disponibles:");
	JComboBox comboXats = new JComboBox();

	JLabel etUsuari = new JLabel("Nom Usuari:");
	JTextField usuari = new JTextField(25);

	JLabel etUltimMissatge = new JLabel("Últim missatge: ");
	JLabel ultimMissatge = new JLabel();

	JLabel etiqueta = new JLabel("Missatges:");
	JTextArea area = new JTextArea();

	JLabel etIntroduccioMissatge = new JLabel("Introdueix missatge:");
	JButton enviar = new JButton("Enviar");
	JTextField missatge = new JTextField(15);

	Firestore database = null;
	DocumentReference docRef = null;

	ListenerRegistration listenerUltimMissatge = null;
	ListenerRegistration listenerMissatges = null;


	// en iniciar posem un contenidor per als elements anteriors
	public void iniciar() throws IOException, InterruptedException, ExecutionException {
		JFrame pantPrincipal = this;
		this.setBounds(100, 100, 450, 400);
		this.setLayout(new BorderLayout());
		// contenidor per als elements
		// Hi haurà títol. Panell de dalt: últim missatge. Panell de baix per a introduir missatge. Panell central: tot el xat

		JPanel panell10 = new JPanel(new FlowLayout());
		panell10.add(etComboXats);
		panell10.add(comboXats);
		JPanel panell11 = new JPanel(new FlowLayout());
		panell11.add(etUsuari);
		panell11.add(usuari);
		JPanel panell12 = new JPanel(new FlowLayout());
		panell12.add(etUltimMissatge);
		panell12.add(ultimMissatge);
		JPanel panell1 = new JPanel(new GridLayout(3, 1));
		panell1.add(panell10);
		panell1.add(panell11);
		panell1.add(panell12);
		getContentPane().add(panell1, BorderLayout.NORTH);

		JPanel panell2 = new JPanel(new BorderLayout());
		panell2.add(etiqueta, BorderLayout.NORTH);
		area.setForeground(Color.blue);
		JScrollPane scroll = new JScrollPane(area);
		panell2.add(scroll, BorderLayout.CENTER);
		getContentPane().add(panell2, BorderLayout.CENTER);

		JPanel panell3 = new JPanel(new FlowLayout());
		panell3.add(etIntroduccioMissatge);
		panell3.add(missatge);
		panell3.add(enviar);
		getContentPane().add(panell3, BorderLayout.SOUTH);

		setVisible(true);
		comboXats.addActionListener(this);
		enviar.addActionListener(this);

		FileInputStream serviceAccount = new FileInputStream(
				"acces-a-dades-6e5a6-firebase-adminsdk-ei7uc-8f5d926921.json");

		GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccount);
		FirebaseOptions options = new FirebaseOptions.Builder().setCredentials(credentials).build();
		FirebaseApp.initializeApp(options);

		database = FirestoreClient.getFirestore();

		// Exemple de llegir tots els documents d'una col·lecció
		// Per a triar el xat
		List<QueryDocumentSnapshot> documents = database.collection("Xats").get().get().getDocuments();
		for (QueryDocumentSnapshot document : documents) {
			comboXats.addItem(document.getId());
		}
		comboXats.setSelectedIndex(0);

	}

	private void inicialitzar() throws InterruptedException, ExecutionException {
		// TODO Auto-generated method stub
		docRef = database.collection("Xats").document(comboXats.getSelectedItem().toString());
		area.setText("");

		// Exemple de lectura única: senzillament sobre un ApiFuture i sobre ell get()
		// Per a posar el títol. Sobre /Xats/XatProva/nomXat
		ApiFuture<DocumentSnapshot> future = docRef.get();
		String nomXat = future.get().getString("nomXat");
		this.setTitle(nomXat);

		// Exemple de listener de lectura contínua addSnapshotListener() sobre un document
		// Per a posar l'últim missatge registrat. Sobre /Xats/XatProva/ultimUsuari i /Xats/XatProva/ultimMissatge
		// Si estava en marxa, el parem abans de tornar-lo a llançar
		if (listenerUltimMissatge != null)
			listenerUltimMissatge.remove();

		listenerUltimMissatge = docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
			@Override
			public void onEvent(@Nullable DocumentSnapshot snapshot, @Nullable FirestoreException e) {
				ultimMissatge.setText(snapshot.getString("ultimMissatge"));
			}
		});

		// Exemple de listener de lectura contínua addSnapshotListener() sobre una col·lecció
		// Per a posar tota la llista de missatges. Sobre /Xats/XatProva/missatges
		// Si estava en marxa, el parem abans de tornar-lo a llançar
		if (listenerMissatges != null)
			listenerMissatges.remove();

		listenerMissatges = database.collection("Xats").document(comboXats.getSelectedItem().toString()).collection("missatges")
				.orderBy("data").addSnapshotListener(new EventListener<QuerySnapshot>() {
					@Override
					public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirestoreException e) {

						for (DocumentChange dc : snapshots.getDocumentChanges()) {
							switch (dc.getType()) {
							case ADDED:
								SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm");
								String dataFormatejada = sdf.format(new Date(dc.getDocument().getLong("data")));
								area.append(dc.getDocument().getString("nom") + " (" + dataFormatejada + "): "
										+ dc.getDocument().getString("contingut") + "\n");
								break;
							}
						}
					}
				});

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == enviar) {
			// Exemple de guardar dades en Cloud Firestore
			// Per a guardar dades. Sobre /Xats/XatProva
			Map<String, Object> dades = new HashMap<>();
			dades.put("ultimUsuari", usuari.getText());
			dades.put("ultimMissatge", missatge.getText());
			docRef.update(dades);

			Missatge m = new Missatge(usuari.getText(), (new Date()).getTime(), missatge.getText());
			database.collection("Xats").document(comboXats.getSelectedItem().toString()).collection("missatges").add(m);

		}

		if (e.getSource() == comboXats) {
			//database = FirestoreClient.getFirestore();
			try {
				inicialitzar();
			} catch (InterruptedException | ExecutionException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}

}


I aquest és el programa principal

import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class CrearXatCloud {

    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        final Pantalla_CrearXatCloud_def finestra = new Pantalla_CrearXatCloud_def();
        finestra.iniciar();
    }
}



I aquest és un exemple d'utilització. Es pot veure el JComboBox per a triar els diferents xats