Omet navegació

3.2.3 RD-IntelliJ: Tot l'exemple

Tot l'exemple

Anem a posar tot l'exemple que arreplega tot l'anterior.

Primer la classe Missatge.java:

class Missatge(var nom: String, var contingut: String)


Ara el programa, que havíem quedat de guardar-lo en el fitxer Exemple_7_3_2_2_FirebaseRD_CrearXat.kt:

import java.awt.EventQueue
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JTextArea
import javax.swing.JButton
import javax.swing.JTextField
import java.awt.BorderLayout
import javax.swing.JPanel
import java.awt.FlowLayout
import java.awt.Color
import javax.swing.JScrollPane
import java.io.FileInputStream

import com.google.firebase.FirebaseOptions
import com.google.auth.oauth2.GoogleCredentials
import com.google.firebase.FirebaseApp
import com.google.firebase.database.*

class CrearXat : JFrame() {

    val etUltimMissatge= JLabel("Últim missatge: ")
    val ultimMissatge= JLabel()

    val etiqueta = JLabel("Missatges:")
    val area = JTextArea()

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

    // en iniciar posem un contenidor per als elements anteriors
    init {
        defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        setBounds(100, 100, 450, 300)
        setLayout(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

        val panell1 = JPanel(FlowLayout())
        panell1.add(etUltimMissatge)
        panell1.add(ultimMissatge)
        getContentPane().add(panell1, BorderLayout.NORTH)

        val panell2 = JPanel(BorderLayout())
        panell2.add(etiqueta, BorderLayout.NORTH)
        area.setForeground(Color.blue)
        area.setEnabled(false)
        val scroll = JScrollPane(area)
        panell2.add(scroll, BorderLayout.CENTER)
        getContentPane().add(panell2, BorderLayout.CENTER)

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

        setVisible(true)
        enviar.addActionListener{enviar()}

        val serviceAccount = FileInputStream("acces-a-dades-6e5a6-firebase-adminsdk-ei7uc-fcf7da56aa.json")

        val options = FirebaseOptions.builder()
            .setCredentials(GoogleCredentials.fromStream(serviceAccount))
            .setDatabaseUrl("https://acces-a-dades-6e5a6.firebaseio.com").build()

        FirebaseApp.initializeApp(options)

        // Exemple de listener de lectura única addListenerForSingleValue()
        // Per a posar el títol. Sobre nomXat
        val nomXat = FirebaseDatabase.getInstance().getReference("nomXat")

        nomXat.addListenerForSingleValueEvent(object : ValueEventListener {
            override
            fun onDataChange(dataSnapshot: DataSnapshot) {
                setTitle(dataSnapshot.getValue().toString())
            }

            override
            fun onCancelled(error: DatabaseError) {
            }
        })

        // Exemple de listener de lectura contínua addValueEventListener()
        // Per a posar l'últim missatge registrat. Sobre a1
        val ultim = FirebaseDatabase.getInstance().getReference("a1")

        ultim.addValueEventListener(object : ValueEventListener {
            override
            fun onDataChange(dataSnapshot: DataSnapshot) {
                ultimMissatge.setText(dataSnapshot.getValue().toString())
            }

            override
            fun onCancelled(error: DatabaseError ) {
            }
        })

        // Exemple de listener d'una llista addChildEventListener()
        // Per a posar tota la llista de missatges. Sobre xat
        val xat = FirebaseDatabase.getInstance().getReference("xat")

        xat.addChildEventListener(object : ChildEventListener {
            override
            fun onChildAdded(dataSnapshot: DataSnapshot, s: String?) {
                area.append(dataSnapshot.child("nom").getValue().toString() + ": "
                        + dataSnapshot.child("contingut").getValue().toString() + "\n"
                )
            }

            override
            fun onChildChanged(dataSnapshot: DataSnapshot, s: String?) {
            }

            override
            fun onChildRemoved(dataSnapshot: DataSnapshot) {
            }

            override
            fun onChildMoved(dataSnapshot: DataSnapshot, s: String?) {
            }

            override
            fun onCancelled(databaseError: DatabaseError) {
            }
        }
        )
    }

    // Exemple de guardar dades sense haver d'esperar per ser una aplicació gràfica
    // Per a guardar dades. Sobre a1, i despŕes sobre la llista xat
    fun enviar() {
        val refA1 = FirebaseDatabase.getInstance().getReference("a1")
        refA1.setValue(missatge.getText(), null)
        val xat = FirebaseDatabase.getInstance().getReference("xat")
        val m = Missatge("Usuari1", missatge.getText())
        xat.push().setValue(m, null)
    }
}

fun main(args: Array<String>) {
    EventQueue.invokeLater {
        CrearXat().isVisible = true
    }
}


Xat compartit

Per a fer-lo més divertit, podríem connectar-nos tots a la mateixa Base de Dades de Realtime Database. Tenim un usuari per a poder fer proves.

Si voleu connectar-vos des de la consola, aquestes són les dades

En l'aplicació l'únic que haureu de fer és incorporar el fitxer json on està la configuració i la clau privada de la connexió. El fitxer s'anomena xat-ad-9f901-firebase-adminsdk-f1vja-ee7dc206de.json, i el teniu com un recurs en l'aula virtual. La URL d'accés a aquesta Base de Dades és: https://xat-ad-9f901-default-rtdb.europe-west1.firebasedatabase.app/

Únicament canviant aquestes 2 coses de la connexió, veureu que estem compartint tots el mateix xat.